pythonを使用して中国語を処理したり、ファイルを読み込んだりやメッセージを処理するとき、文字化けが見つかった場合(stringの処理、ファイルの読み書き、print)、ほとんどの人が行うことは、のencode/decodeを呼び出すことです。デバッグ中、文字化けが発生する理由を明確に考えていませんでしたが、今日はエンコードの問題に対処する方法について説明します。
注: 以下の説明は Python2 に関するものです。 ASCII | UTF-8 など。 unicode は両方ともベースstring
のサブクラスです。 したがって、それが string であるかどうかを判断する方法がありますdef is_str(s): Return isinstance(s,basestring) str と Unicode 変換str -> decode('the_coding_of_str') -> unicode unicode -> encode('the_coding_you_want') -> str
差異宣言メソッドTraceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xe6 in position 0: ordinal not in range(128)(バイト数を返す)
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py", line 16, in decode return codecs.utf_8_decode(input, errors, True) UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in position 0-1: ordinal not in range(128)
>>> s = ‘中文‘ s = u‘中文‘.encode(‘utf-8‘) >>> type(‘中文‘) <type ‘str‘>ロジックで実際に使用したいものの長さを調べます(文字数を返します)
>>> u‘中文‘.encode(‘utf-8‘) ‘\xe4\xb8\xad\xe6\x96\x87‘ >>> len(u‘中文‘.encode(‘utf-8‘)) 6結論 str が依然として Unicode である場合に対処する必要があることを理解し、適切な処理方法 (str.decode/unicode.encode) を使用します 以下は、Unicode/str であるかどうかを判断する方法です
>>> s = u‘中文‘ >>> s = ‘中文‘.decode(‘utf-8‘) >>> s = unicode(‘中文‘, ‘utf-8‘) >>> type(u‘中文‘) <type ‘unicode‘>単純な原則: don str には encode を使用せず、unicode には decode を使用しないでください (実際、str をエンコードできます。詳細については最後を参照してください。簡単にするために、それはお勧めしません)
>>> u‘中文‘ u‘\u4e2d\u6587‘ >>> len(u‘中文‘) 2異なるエンコード変換、中間エンコードとして unicode を使用してください
>>> isinstance(u‘中文‘, unicode) True >>> isinstance(‘中文‘, unicode) False >>> isinstance(‘中文‘, str) True >>> isinstance(u‘中文‘, str) False
ファイル処理
、IDEとコンソールの処理プロセスは、次のように使用できます。Pythonをプール、入り口、出口として考えてください入り口では、すべてがUnicodeに変換され、出口では、すべてが Unicode を使用して処理され、出口でターゲットのエンコーディングに変換されます (もちろん、処理ロジックで使用する必要がある例外があります。特定のエンコーディング状況です) ファイルの読み取り 外部入力エンコーディング、Unicode にデコードします 処理 (内部エンコード、統一 Unicode) 必要なターゲット エンコードにエンコードします ターゲット出力 (ファイルまたはコンソール) に書き込みます IDE およびコンソールでエラーが報告されます。その理由は、印刷時にエンコードが IDE のものと一致しないためです。 出力時に同じエンコードに変換すると正常に出力できる>>> ‘中文‘.encode(‘utf-8‘) Traceback (most recent call last): File "推奨事項エンコードを標準化する特定のリンクによる文字化けを防ぐためにエンコードを統一する環境、IDE/テキスト", line 1, in UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xe4 in position 0: ordinal not in range(128) >>> u‘中文‘.decode(‘utf-8‘) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py", line 16, in decode return codecs.utf_8_decode(input, errors, True) UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in position 0-1: ordinal not in range(128)
エディタ、ファイルエンコーディング、データベースデータテーブルエンコーディング
コードソースファイルのエンコーディングを確認してくださいこれは非常に重要ですソースコードファイル内のpyファイルのデフォルトエンコーディングは、非ASCII文字の場合はASCIIです。を使用する場合は、ファイルのヘッダーでエンコーディングを宣言する必要があります。宣言しない場合は、ファイルの 1 行目または 2 行目にエンコーディングを配置する必要があります。#s是code_A的str s.decode(‘code_A‘).encode(‘code_B‘)ヘッダーでcoding= utf-8、a = '中国語'を宣言した場合、そのエンコーディングはutf-8ですヘッダーでcoding=gb2312、a = '中国語'を宣言した場合、そのエンコーディングはgbkですつまり、すべて同じプロジェクト内のソース ファイルのヘッダーは同じエンコーディングを持ち、宣言されたエンコーディングはソース ファイルに保存されているエンコーディングと一致している必要があります (エディター関連) ソース コード内で処理するためのハードコーディングされた文字列として使用され、一律に Unicode を使用します
将其类型和源文件本身的编码隔离开, 独立无依赖方便流程中各个位置处理
if s == u‘中文‘: #而不是 s == ‘中文‘ pass #注意这里 s到这里时,确保转为unicode
以上几步搞定后,你只需要关注两个 unicode和 你设定的编码(一般使用utf-8)
处理顺序
1. Decode early 2. Unicode everywhere 3. Encode later
相关模块及一些方法
获得和设置系统默认编码
>>> import sys >>> sys.getdefaultencoding() ‘ascii‘ >>> reload(sys) <module ‘sys‘ (built-in)> >>> sys.setdefaultencoding(‘utf-8‘) >>> sys.getdefaultencoding() ‘utf-8‘ >>> str.encode(‘other_coding‘)
在python中,直接将某种编码的str进行encode成另一种编码str
#str_A为utf-8 str_A.encode(‘gbk‘) 执行的操作是 str_A.decode(‘sys_codec‘).encode(‘gbk‘) 这里sys_codec即为上一步 sys.getdefaultencoding() 的编码
‘获得和设置系统默认编码‘和这里的str.encode是相关的,但我一般很少这么用,主要是觉得复杂不可控,还是输入明确decode,输出明确encode来得简单些
chardet
文件编码检测,下载
>>> import chardet >>> f = open(‘test.txt‘,‘r‘) >>> result = chardet.detect(f.read()) >>> result {‘confidence‘: 0.99, ‘encoding‘: ‘utf-8‘}
\u字符串转对应unicode字符串
>>> u‘中‘ u‘\u4e2d‘ >>> s = ‘\u4e2d‘ >>> print s.decode(‘unicode_escape‘) 中 >>> a = ‘\\u4fee\\u6539\\u8282\\u70b9\\u72b6\\u6001\\u6210\\u529f‘ >>> a.decode(‘unicode_escape‘) u‘\u4fee\u6539\u8282\u70b9\u72b6\u6001\u6210\u529f‘
以上がPythonのエンコード処理におけるstrとUnicodeの違いと用途分析を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。