ホームページ >バックエンド開発 >Python チュートリアル >Python は中国語の文字エンコーディングの問題を解決します: Unicode Decode Error_python

Python は中国語の文字エンコーディングの問題を解決します: Unicode Decode Error_python

高洛峰
高洛峰オリジナル
2017-02-23 15:53:003514ブラウズ

前書き

最近、プロジェクトの必要性により、中国語を含む txt ドキュメントを読み取り、ファイルを保存する必要があります。この文書は以前、base64 でエンコードされていたため、すべての漢字が読み取られ、文字化けして表示されていました。プロジェクト チームが Base64 を放棄した後、2 つのエラーが連続して発生しました:

ascii codec can't encode characters in position ordinal not in range 128
UnicodeDecodeError: ‘utf8' codec can't decode byte 0x。

ASCII、Unicode、utf-8 について知らない場合は、文字列とエンコーディングに関するこの前の記事を読むことができます

その後、次の 3 つの概念を理解してください:

  1. ascii は数字、英語の文字、一部の特殊記号のみを表現できますが、中国語の文字は表現できません

  2. Unicode と utf-8 は両方とも中国語の文字を表現できます、unicode は固定長、utf です-8は可変長です

  3. メモリ内の保存方法は一般的にunicodeで、ディスクファイルの保存方法は一般にutf-8です。utf-8はストレージスペースを節約できるためです

それではPythonのデフォルトとは何ですかエンコーディングは?

>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> reload(sys)
<module &#39;sys&#39; (built-in)>
>>> sys.setdefaultencoding(&#39;utf-8&#39;)
>>> sys.getdefaultencoding()
&#39;utf-8&#39;

Python のデフォルトのエンコーディングは、sys.setdefaultencoding('utf-8') 関数を通じて設定できます。 sys.setdefaultencoding('utf-8')函数设置python的默认编码。

python中可以通过encode和decode的方式改变数据的编码,比如:

>>> u&#39;汉字&#39;
u&#39;\u6c49\u5b57&#39;
>>> u&#39;汉字&#39;.encode(&#39;utf-8&#39;)
&#39;\xe6\xb1\x89\xe5\xad\x97&#39;
>>> u&#39;汉字&#39;.encode(&#39;utf-8&#39;).decode(&#39;utf-8&#39;)
u&#39;\u6c49\u5b57&#39;

我们可以通过这两个函数设置编码。

那么,python中的str是什么类型?

>>> import binascii
>>> &#39;汉字&#39;
&#39;\xba\xba\xd7\xd6&#39;
>>> type(&#39;汉字&#39;)
<type &#39;str&#39;>
>>> print binascii.b2a_hex(&#39;汉字&#39;)
babad7d6
>>> print binascii.b2a_hex(u&#39;汉字&#39;)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
UnicodeEncodeError: &#39;ascii&#39; codec can&#39;t encode characters in
position 0-1: ordinal not in range(128)
>>> print binascii.b2a_hex(u&#39;汉字&#39;.encode(&#39;utf-8&#39;))
e6b189e5ad97
>>> print binascii.b2a_hex(u&#39;汉字&#39;.encode(&#39;gbk&#39;))
babad7d6

binascii是将数据的二进制转换成ascii,上面的解释是:‘汉字'的类型是str,二进制是babad7d6,u‘汉字'是无法转换成ascii,这样就报出了开头的第一个错误。解决办法就是把它.encode(‘utf-8')成str类型。因为我命令行是windows默认的GBK编码,所有u'汉字'.encode(‘gbk')

Python では、次のような encode と decode を通じてデータのエンコーディングを変更できます。

    import sys
    reloads(sys)
    sys.setdefaultencoding(&#39;utf-8&#39;)
  1. これら 2 つの関数を通じてエンコーディングを設定できます。
  2. では、Python の str はどのような型でしょうか?

import codecs
codecs.open(file_name, "r",encoding=&#39;utf-8&#39;, errors=&#39;ignore&#39;)

binascii はデータのバイナリを ASCII に変換します。上記の説明は次のとおりです。「漢字」の型は str で、バイナリは babad7d6 です。u「漢字」は ASCII に変換できません。と報告されています 冒頭の最初の間違い。解決策は、 .encode('utf-8') して str 型に変換することです。私のコマンドラインは Windows のデフォルトの GBK エンコーディングを使用しているため、すべての u'中国語文字'.encode('gbk') が使用されている場合、出力結果は「中国語文字」の結果と同じになります。

要約すると、Python の str は実際には Unicode の一種です。非 ASCII を ASCII に変換すると、エラーが報告されます。

encode (' 適切なエンコーディング') => str

str => decode('適切なエンコーディング') => unicode

、これで保存できます。大変苦労しました:

🎜🎜rrreee🎜🎜🎜 2 番目の問題では、ファイルの読み取り時にエラーが発生します。 UTF-8 ファイルには BOM モードと BOM なしモードの 2 つのモードがあります。この 2 つの違いは、BOM ファイルには BOM なしファイルよりもヘッダーが 1 つ多いため、UTF-8 モードでファイルを読み取るときにエラーが発生することのようです。以前、ファイルを読み込もうとしたのですが、まずBOMがあるかどうかを判断してBOMファイルのヘッダーを読み飛ばしてしまい、失敗してしまいました~~。 🎜🎜具体的な操作方法は、コーデックライブラリを使用してファイルを読み取ることです(このライブラリはファイルのヘッダーを検出するためのものだと思います)。 🎜🎜🎜rrreee🎜🎜🎜 エンコードの問題については、ascii、unicode、utf-8 の動作原理を理解する必要があります。 🎜🎜中国語の文字エンコーディングの問題に対する Python の解決策の詳細については、Unicode Decode Error_python 関連記事、PHP 中国語 Web サイトに注目してください。 🎜
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。