マイクロチャネルグループのシェア:パイソンをコードする素人の言語と文字で

1989年グイド・ヴァンロッサムダニエルの発明によるPython言語は、それは、世界で最も人気のあるコンピュータープログラミング言語の一つであるだけでなく、コンピューティングエコシステムの言語「有用な学習、と長い時間を学ぶことができ、学ぶことができます」。

このため、中国最大のITコミュニティとして、特にファンの大多数にCSDNは、より効率的に学ぶために道路上のヘルプの人々の迂回路へのPython Pythonのクラスを設定します。3月21日、夜08時、私たちはクラスで開催された、よく知られている技術的な専門家劉志軍教師Pythonの共有活動を招待しました。

劉志軍、開発経験の6年間は、ZTEは就任式、文系インタラクティブました。彼は爬虫類、データマイニングの利益の強い、Web技術インフラを専門としています。データ分析は、現在、大手製薬グループに従事しています。マイクロチャンネル公共数:Pythonの禅(vttalk)

以下は、昨夜のシェアである:
このテーマについてなぜ話?
これは他の場所に現れたエラーは、最も一般的な間違いはUnicodeEncodeErrorを、UnicodeDecodeErrorである、あなたは、残念ながら、解決する方法を知っているように見えるPythonの開発を行って、それぞれがあまりにも文字エンコーディングの問題で混乱してきた、と言われて、問題が常に同じ過ちで、STRユニコード間のエンコードやデコード変換方法にも、覚えるのが特に難しい常に場所を正確に問題があり、混乱?

この問題を明確にするために、私はPythonの文字列の組成と文字符号化の詳細から、簡単な言葉で分析することにしました。
バイト文字
すべてのコンピュータに格納されたデータ、テキスト文字、画像、ビデオ、オーディオ、ソフトウェアはバイトは8ビットに等しく、列01のバイトのシーケンスで構成されています。

文字は、そのような句読点が文字と呼ばれることができ、文字、文字、数字、記号など、です。

簡単に保存・輸送ネットワークのバイト、読みやすい文字表示。たとえば、文字「p」はハードディスクに格納されたバイナリデータ01110000、1つのバイト長のシリーズです。
エンコードとデコード
、我々はオープンに、テキストエディタを使用する時間を、文字を見て、最終的にバイトのバイナリシーケンスにまで保持され、ディスクに保存されています。次いで、文字のバイト変換処理(エンコード)をコードする呼ばれ、今度は、(復号化)復号化と呼ばれ、それは可逆プロセスでもあります。伝送を格納するための符号化、復号化、表示を読み取りやすくするために行われます。

たとえば、プロセスをコードした後は、ハードディスクに文字「p」は、バイナリ列01110000バイト、1つのバイト長の文字列です。文字「禅」はおそらく「11100111 1,010,011,010,000,101は、」ストレージの3バイトの長さを占めている、なぜそれが可能ですか?このビットは、後に言います。

Pythonはなぜこれほど退屈なコーディング?もちろん、これは開発者を責めることはできません。

Python2使用のASCII文字がデフォルトのエンコーディングとしてエンコードし、ASCIIは中国を扱うことができないためです。

なぜそれをUTF8ではありませんか?コードの最初の行を書き込むためのPythonのグイドの父は1989年の冬にあるため、1991年2月に正式に最初のオープンソース版をリリース、およびUnicodeは、1991年10月にリリースされた、それは言語のPythonの作成を言うことですUTF8は、まだ生まれたときに、これが一つです。

これにより、開発者は、他である、宙返りここにアップロードされているので、文字列型、ユニコードとstrの2種類、なぜ、Pythonの混乱です。

文字列を達成するために徹底的にのpython3は、後のために何かある一種類のみを残し、再整形しました。
STRとUnicode
Pythonの2列は、2つのタイプに分け、およびUnicode STRあります。バイナリバイト列strの自然の順序で、「禅」が進\ XEC \ XF8を印刷する以下のサンプルコード型STRに見ることができる、それはバイト「1,110,110,011,111,000」相当の二進シーケンスです。

>>> s = '禅'

>>> s

'\xec\xf8'

>>> type(s) <type 'str'>

Unicodeの種類およびuの「禅」の記号は、対応するUnicodeのu「\ u7985」です

>>>u = u"禅"

>>>u

u'\u7985'

>>> type(u) <type 'unicode'>

我々は、またはタイプSTRによって符号化され、次いで、エンコードPythonがユニコードSTRへ変換する方法を提供し、またその逆に変換するネットワーク必要にファイルUnicodeのシンボルを保存します。
画像のキャプション

エンコード


>>>u = u"禅"

>>>u u'\u7985'

>>> u.encode("utf­8") '\xe7\xa6\x85'

デコード

>>>s = "禅"

>>>s.decode("utf­8") u'\u7985'

>>>

初心者は、あなたが、本質的に、実際のバイナリデータの文字列、およびUnicode文字(記号)であるSTR覚えていれば、(エンコード)をコード化することにあり、エンコードやデコードとSTRとUnicodeの間でどのように多くの遷移を思い出すことができません文字(記号)を使用エンコードにSTR変換方法バイナリデータ、ユニコードを処理するように変換され、復号化方法は、順番に使用することです。

STRとUnicodeの間に明確な形質転換後、ときUnicodeEncodeErrorを、UnicodeDecodeErrorエラー表示されますどのように見てみましょう。
UnicodeEncodeErrorを
UnicodeEncodeErrorをはとき、バイトのシーケンス、例を見て、ファイルを保存するためのUnicode文字列の文字のUnicode文字列strに変換起こります。

# ­*­ coding:utf­8 ­*­

def main():

name = u'Python之禅'

f = open("output.txt", "w") f.write(name)

エラーログ

UnicodeEncodeErrorを:「ASCII」コーデックできない位置67でのエンコード文字:序ない範囲内(128)
なぜUnicodeEncodeErrorをがありますか?

それはSTRある場合は、writeメソッドを呼び出すときなので、Pythonはまず直接、どのような種類の文字列を決定する文字列str自体の種類は、バイナリの文字列のバイトのシーケンスであるため、ノーコーディングファイルに書き込みます。

ストリングがUnicodeタイプである場合、それは第一型STRのバイナリ形式に変換するUnicode文字列にエンコードメソッドをコールし、ファイルに保存し、エンコード方法は、と同等のデフォルトのPython ASCIIコード符号化を使用します。

>>> u"Python之禅".encode("ascii")

しかし、我々は唯一のASCII文字セットは、中国語の文字を含まない128ラテンアルファベットを、含まれている知っている、エラーが「ASCII」コーデックがの文字をエンコードすることはできませんが発生しました。UTF8、GBK:適切にコード化するために、次のような漢字を、含まれている文字セットを指定する必要があります。

>>>u"Python之禅".encode("utf­8") 'Python\xe4\xb9\x8b\xe7\xa6\x85'

>>>u"Python之禅".encode("gbk") 'Python\xd6\xae\xec\xf8'

だから、文字列UTF8 GBKエンコーディングや変換を進める必要があり、正しく書かれた文字列ファイルをUNICODE必要があります。

def main():

name = u'Python之禅'

name = name.encode('utf­8')

with open("output.txt", "w") as f:

f.write(name)

もちろん、Unicode文字列が正しく、より片道超えるファイルを書きますが、原理は同じですが、ここには導入は、データベースへの文字列は、ネットワークは同じ原理に送信されません。
A UnicodeDecodeError
UnicodeDecodeErrorは、Unicode文字列型に復号バイトシーケンスSTR型を生じます。

>>>a = u"禅"

>>>a u'\u7985'

>>>b = a.encode("utf­8")

>>>b

'\xe7\xa6\x85'

>>> b.decode("gbk")

Traceback (most recent call last): File "<stdin>", line 1, in <module>

UnicodeDecodeError: 'gbk' codec can't decode byte 0x85 in position 2: incomplete multibyte sequence

バイトのシーケンスは、コード生成UTF8後に「\ XE7 \ xa6 \ X85」GBKは次にGBKが2バイトのみを占有コード、およびUTF8(漢字のため)ので、UnicodeDecodeErrorが発生し、デコードされたUnicode文字列に変換する場合それが解決できない場合、変換GBK、複数のバイトので、それは、3つのバイトを占めています。UnicodeDecodeError符号化タイプを回避するための鍵は、エンコードとデコードの保持と一致しています。

これはまた、記事では、フォーマットはいをコード指定したときに2がエンコード特定の実行に、可能なバイト、3バイトを占めている可能性がファイルに保存され、文字「禅」の冒頭で述べた答え。

UnicodeDecodeErrorの別の例として、

 x = u"Python"

>>> y = "之禅"

>>> x + y

Traceback (most recent call last): File "<stdin>", line 1, in <module>

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

>>>

+ STRとUnicode文字列操作を行い、型バイトシーケンスSTR Pythonは、暗黙的に同じxおよびUnicode型に(デコード)に変換しますが、Pythonは符号化されたASCII文字を変換するデフォルト、およびASCIIでそれは中国なので、エラーが含まれていません。

>>> y.decode('ascii')

Traceback (most recent call last): File "<stdin>", line 1, in <module>

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

Y UTF8またはGBKによって復号化する適切な方法があります。


>>>x = u"Python"

>>>y = "之禅"

>>>y = y.decode("utf­8")

>>>x + y u'Python\u4e4b\u7985'

その上のpython3の文字エンコーディングに、Python2の条件に基づいており、それは別のトピック、滞在チューニングを開きます。


CSDN Pythonのクラスは、組織内の熱いサインアップPythonのファンを歓迎し、>> ==をクリックし、[保存]クラス活動Pythonの爬虫類のエントリと実践を

公開された155元の記事 ウォンの賞賛964 ・は 80000 +を見て

おすすめ

転載: blog.csdn.net/mengyidan/article/details/80128690