Python文字列のencodeとdecodeの研究心得乱符号化問題の解決方法(多くの符号化問題はこれから答えを出すことができる)

2528 ワード

なぜPythonの使用中に様々な文字化けしが発生するのか、中国語文字なのに「xe 4xb 8xadxe 6x 96x 87」と表示されるのか.
なぜ「UnicodeEncodeError:'ascii'codec can't encode characters in position 0-1:ordinal not in range(128)」と間違えたのですか?本文はこの問題を研究する.
文字列のPython内部の表示は
unicode符号化のため、符号化変換を行う際には、通常、unicodeを中間符号化として、すなわち、他の符号化文字列をunicodeに復号し、unicodeから別の符号化を行う必要がある.
decodeの役割は、str 1のような他の符号化文字列をunicode符号化に変換することである.decode('gb 2312')は、gb 2312を符号化する文字列str 1をunicode符号化に変換することを示す.
Encodeの役割は、str 2のようなunicode符号化を他の符号化文字列に変換することである.encode('gb 2312')は、unicode符号化された文字列str 2をgb 2312符号化に変換することを示す.
したがって、トランスコードするときは、文字列strが何で符号化され、decodeがunicodeになり、encodeが他の符号化になるかを理解しなければなりません.
コード内の文字列のデフォルトの符号化は、コードファイル自体の符号化と一致します.
例えば:s='中国語'
utf 8のファイルであれば、文字列はutf 8符号化であり、gb 2312のファイルであればgb 2312に符号化される.この場合、符号化変換を行うには、decode法でunicode符号化に変換し、encode法で他の符号化に変換する必要がある.通常、特定の符号化方式が指定されていない場合、システムのデフォルト符号化を使用して作成されるコードファイルです.
文字列がこのように定義されている場合:s=u'中国語'
この文字列の符号化はunicode、すなわちpythonの内部符号化として指定され、コードファイル自体の符号化とは無関係である.したがって,この場合に符号化変換を行うには,encode法を直接用いて指定符号化に変換するだけでよい.
文字列がすでにunicodeである場合、復号を行うとエラーが発生するため、通常、その符号化方式がunicodeであるかどうかを判断します.
isinstance(s,unicode)#unicodeであるか否かを判断する
非unicode符号化形式strでencodeがエラーを報告する
システムのデフォルト符号化を取得するにはどうすればいいですか?
#!/usr/bin/env python #coding=utf-8 import sys print sys.getdefaultencoding()
このセグメントプログラムは英語WindowsXPでasciiとして出力されます.
いくつかのIDEでは、文字列の出力に常に文字化けしたり、エラーが発生したりしますが、実際には、IDEの結果、出力コンソール自体がプログラム自体の問題ではなく、文字列の符号化を表示できないためです.
UliPadで次のコードを実行します.
s=u「中国語」print s
ヒント:UnicodeEncodeError:'ascii'codec can't encode characters in position 0-1:ordinal not in range(128).これは、UliPadの英語WindowsXP上のコンソール情報出力ウィンドウがascii符号化に従って出力され(英語システムのデフォルト符号化はascii)、上のコードの文字列がUnicode符号化されているため、出力時にエラーが発生したためである.
最後の文をprint s.encode('gb 2312')に変更します.
「中国語」の2文字が正しく出力されます.
最後の文をprint s.encode('utf 8')に変更すると
出力:xe 4xb 8xadxe 6x 96x 87、これはコンソール情報出力ウィンドウがascii符号化に従ってutf 8符号化された文字列を出力した結果である.
unicode(str,'gb 2312')はstr.decode('gb 2312')と同様であり、gb 2312で符号化されたstrをunicode符号化に変換する
str._の使用class__strの符号化形式を表示できます
原理は長いこと言っていたが,最後に百病を治す人が来ただろう.
 
    
#!/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')