ホームページ >バックエンド開発 >Python チュートリアル >Pythonの中国語文字化け問題まとめ
次のような同様のコードを実行します:
#!/usr/bin/env python s="中文" print s
最近この問題によく遭遇します:
問題 1: SyntaxError: ファイル E:codingpythonUntitled 6.py の 3 行目に非 ASCII 文字 'xe4'ただし、エンコーディングが宣言されていません。詳細については http://www.python.org/peps/pep-0263.html を参照してください
質問 2: UnicodeDecodeError: 'ascii' コーデックは位置 108 のバイト 0xe5 をデコードできません: 序数が範囲内にありません(128)
質問 3: UnicodeEncodeError: 'gb2312' コーデックは位置 72366 の文字 u'u2014' をエンコードできません: 不正なマルチバイト シーケンス
これらはすべて文字エンコーディングに関連した問題で、非常に憂鬱で、中国語はいつもできませんでした。それを理解したので、私は数日前に見つけた解決策のいくつかを紹介します
そのため、Python の文字列の内部表現はエンコード時に行われます。変換では、通常、Unicode を中間エンコーディングとして使用する必要があります。つまり、他のエンコーディングの文字列が最初に Unicode にデコードされ、次に Unicode から別のエンコーディングにエンコードされます。
decode の機能は、str1.decode('gb2312') など、他のエンコードされた文字列を Unicode エンコードに変換することです。これは、gb2312 でエンコードされた文字列 str1 を Unicode エンコードに変換することを意味します。
encode の機能は、Unicode エンコードを他のエンコードされた文字列 (str2.encode('gb2312') など) に変換することです。これは、Unicode エンコードされた文字列 str2 を gb2312 エンコードに変換することを意味します。
一部の IDE では、文字列出力が常に文字化けしたり、間違って表示されたりすることがあります。これは実際には、プログラム自体の問題ではなく、IDE の結果出力コンソール自体が文字列のエンコーディングを表示できないことが原因です。
UliPad で次のコードを実行すると:
s=u"中文"
print s
というプロンプトが表示されます: UnicodeEncodeError: 'ascii' コーデックは位置 0-1 の文字をエンコードできません: 序数が範囲内にありません( 128)。これは、英語版 Windows 上の UliPad のコンソール情報出力ウィンドウが原因です。
最後の文を print s.encode('gb2312') に変更します
「中国語」という単語は正しく出力できます。
最後の文を print s.encode('utf8')
に変更すると、出力は xe4xb8xadxe6x96x87 になります。これは、コンソール情報出力ウィンドウが ASCII エンコードに従って utf8 でエンコードされた文字列を出力した結果です。
次のコードは、次のようにより一般的かもしれません:
#!/usr/bin/env python #coding=utf-8 s="中文" if isinstance(s, unicode): #s=u"中文" print s.encode('gb2312') else: #s="中文" print s.decode('utf-8').encode('gb2312') #!/usr/bin/env python #coding=utf-8 s="中文" if isinstance(s, unicode): #s=u"中文" print s.encode('gb2312') else: #s="中文" print s.decode('utf-8').encode('gb2312')
次のコード部分を見てください:
#!/usr/bin/env python #coding=utf-8 #python version:2.7.4 #system:windows xp import httplib2 def getPageContent(url): ''''' 使用httplib2用编程的方式根据url获取网页内容 将bytes形式的内容转换成utf-8的字符串 ''' #使用ie9的user-agent,如果不设置user-agent将会得到403禁止访问 headers={'user-agent':'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'cache-control':'no-cache'} if url: response,content = httplib2.Http().request(url,headers=headers) if response.status == 200 : return content
import sys reload(sys) sys.setdefaultencoding('utf-8') #修改默认编码方式,默认为ascci print sys.getdefaultencoding() content = getPageContent("http://www.oschina.net/") print content.decode('utf-8').encode('gb2312') #!/usr/bin/env python #coding=utf-8 #python version:2.7.4 #system:windows xp import httplib2 def getPageContent(url): ''' 使用httplib2用编程的方式根据url获取网页内容 将bytes形式的内容转换成utf-8的字符串 ''' #使用ie9的user-agent,如果不设置user-agent将会得到403禁止访问 headers={'user-agent':'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'cache-control':'no-cache'} if url: response,content = httplib2.Http().request(url,headers=headers) if response.status == 200 : return content
上記コードの意味: www.oschina.net ウェブサイトから彼のホームページをリクエストします (utf-8 で直接エンコードされている場合、中国語は出力できません) エンコード方法を utf-8 から変更したいgd2312 に変更しましたが、問題 3 があります。 gb2312', 'ignore')、中国語は表示できますが、一部だけかどうかはわかりません
ただし。 、ウェブサイトを www.soso.com に変更する場合、gb2312 に変換する必要はなく、utf-8 を使用するだけで正常に中国語を表示できます
要約すると、
ss をファイルに直接出力しても同じ結果がスローされます。例外。 Unicode の中国語文字列を処理する場合は、まずその文字列に対して encode 関数を呼び出して、他のエンコード出力に変換する必要があります。これはあらゆる環境に当てはまります。 Python では、「str」オブジェクトはバイト配列です。内部のコンテンツが正当な文字列であるかどうか、または文字列がどのようなエンコーディング (gbk、utf-8、unicode) を使用しているかは関係ありません。これらのコンテンツは、ユーザー自身が記録し、判断する必要があります。これらの制限は「unicode」オブジェクトにも適用されます。後で説明するように、「unicode」オブジェクトの内容は必ずしも有効な Unicode 文字列であるとは限らないことに注意してください。 Windows コンソールでは、gbk でエンコードされた str オブジェクトと unicode でエンコードされた unicode オブジェクトがサポートされています。