私はPythonスクリプトに触れ始めたのですが、始めてすぐに中国語の文字化けの問題に遭遇しました。
インターネット上の情報と組み合わせて要約すると、次のとおりです。
Python の文字列の内部表現は Unicode エンコーディングであるため、エンコーディング変換を行う場合、通常は中間エンコーディングとして Unicode を使用する必要があります。つまり、最初に他のエンコーディングの文字列を変換し、デコードして Unicode に変換し、次に Unicode から別のエンコーディングにエンコードします。
decode デコード。この関数は、str1.decode('gb2312') など、他のエンコードされた文字列を Unicode エンコードに変換することです。これは、gb2312 でエンコードされた文字列 str1 を Unicode エンコードに変換することを意味します。
エンコード エンコード。この機能は、Unicode エンコードを str2.encode('gb2312') などの他のエンコード文字列に変換することです。これは、Unicode エンコード文字列 str2 を gb2312 エンコードに変換することを意味します。
文字列がすでに Unicode である場合、デコード時にエラーが発生するため、通常はそのエンコード方法が Unicode であるかどうかを判断する必要があります:
isinstance(s, unicode) #Unicode かどうかを判断するために使用されます
非 Unicode エンコード形式で str を使用してエンコードするとエラーが発生します
システムのデフォルトのエンコードを取得するにはどうすればよいですか?
#!/usr/bin/python
#coding=utf-8
import sys
print sys.getdefaultencoding()
英語版 WindowsXP でのこのプログラムの出力は次のとおりです: ascii
一部の IDE では、文字列の出力が常に文字化けしたり、エラーになったりすることがあります。実際、これはプログラム自体の問題ではなく、IDE の結果出力コンソール自体が文字列のエンコーディングを表示できないことが原因です。
UliPad で次のコードを実行すると:
s=u"中国語" #Unicode エンコードを指定する
print s
がプロンプトを表示します: UnicodeEncodeError: 'ascii' codec can't encodecharacters in Position 0-1: ordinal範囲内にありません(128)。これは、英語版 Windows 上の UliPad のコンソール情報出力ウィンドウが原因です。
最後の文を print s.encode('gb2312') に変更します
単語「中国語」は正しく出力できます。
最後の文を print s.encode('utf8')
に変更すると、出力は xe4xb8xadxe6x96x87 になります。これは、コンソール情報出力ウィンドウが ASCII エンコードに従って utf8 でエンコードされた文字列を出力した結果です。
unicode(str,'gb2312') と str.decode('gb2312') は同じで、どちらも gb2312 でエンコードされた str を Unicode エンコードに変換します
str のエンコード形式を表示するには str.__class__ を使用します
原則 話した後長い間、私は次のコードを思いつきました:
#coding=utf-8
#!/usr/bin/python
s="中文"
if isinstance(s, unicode) :
print s .encode('gb2312')
else:
print s.decode('utf-8').encode('gb2312')