ホームページ  >  記事  >  バックエンド開発  >  Pythonの中国語文字化け問題まとめ

Pythonの中国語文字化け問題まとめ

高洛峰
高洛峰オリジナル
2016-10-19 16:09:291409ブラウズ

次のような同様のコードを実行します:

#!/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 オブジェクトがサポートされています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。