前書き
最近、プロジェクトの必要性により、中国語を含む 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 つの概念を理解してください:
ascii は数字、英語の文字、一部の特殊記号のみを表現できますが、中国語の文字は表現できません
Unicode と utf-8 は両方とも中国語の文字を表現できます、unicode は固定長、utf です-8は可変長です
メモリ内の保存方法は一般的にunicodeで、ディスクファイルの保存方法は一般にutf-8です。utf-8はストレージスペースを節約できるためです
それではPythonのデフォルトとは何ですかエンコーディングは?
>>> import sys >>> sys.getdefaultencoding() 'ascii' >>> reload(sys) <module 'sys' (built-in)> >>> sys.setdefaultencoding('utf-8') >>> sys.getdefaultencoding() 'utf-8'
Python のデフォルトのエンコーディングは、sys.setdefaultencoding('utf-8')
関数を通じて設定できます。 sys.setdefaultencoding('utf-8')
函数设置python的默认编码。
python中可以通过encode和decode的方式改变数据的编码,比如:
>>> u'汉字' u'\u6c49\u5b57' >>> u'汉字'.encode('utf-8') '\xe6\xb1\x89\xe5\xad\x97' >>> u'汉字'.encode('utf-8').decode('utf-8') u'\u6c49\u5b57'
我们可以通过这两个函数设置编码。
那么,python中的str是什么类型?
>>> import binascii >>> '汉字' '\xba\xba\xd7\xd6' >>> type('汉字') <type 'str'> >>> print binascii.b2a_hex('汉字') babad7d6 >>> print binascii.b2a_hex(u'汉字') Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) >>> print binascii.b2a_hex(u'汉字'.encode('utf-8')) e6b189e5ad97 >>> print binascii.b2a_hex(u'汉字'.encode('gbk')) babad7d6
binascii是将数据的二进制转换成ascii,上面的解释是:‘汉字'的类型是str,二进制是babad7d6,u‘汉字'是无法转换成ascii,这样就报出了开头的第一个错误。解决办法就是把它.encode(‘utf-8')成str类型。因为我命令行是windows默认的GBK编码,所有u'汉字'.encode(‘gbk')
import sys reloads(sys) sys.setdefaultencoding('utf-8')
では、Python の str はどのような型でしょうか?
import codecs codecs.open(file_name, "r",encoding='utf-8', errors='ignore')
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 サイトに注目してください。 🎜