python 2中国語符号化問題

2717 ワード

pythonコードでは、中国語を書くと文字化けしやエラーがよく発生します.
======================
1、まずシステムのデフォルトコードを見る
すなわち、システムのデフォルトの符号化形式はasciiである.
2、今ASCIIと非ASCIIコードを了解する
コンピュータ内では、すべての情報が最終的にバイナリ文字列として表示されます.各バイナリビット(bit)には0と1の2つの状態があるため、8つのバイナリビットは256の状態を組み合わせて1バイト(byte)と呼ぶことができる.前世紀60年代、米国は文字コードを制定し、英語の文字とバイナリビットの関係を統一的に規定した.これはASCIIコードと呼ばれ、現在まで使われています.ASCIIコードは全部で128文字のコードを規定しています.
英語は128個の記号で符号化すれば十分ですが、他の言語を表すには128個の記号では足りません.例えば、簡体字中国語の一般的な符号化方式はGB 2312であり、2バイトで1つの漢字を表すため、理論的には256 x 256=65536個の記号を表すことができる.これらは非ASCII符号化に属する.
3、unicode
前節で述べたように、世界には複数の符号化方式が存在し、同じバイナリ数字を異なる記号として解釈することができる.そのため、テキストファイルを開くには、その符号化方式を知らなければならない.そうしないと、誤った符号化方式で解読され、文字化けしてしまう.unicode符号化は、世界のすべての記号を組み込む.各記号にはユニークな符号化が与えられる.
しかし、unicodeはシンボルセットにすぎず、シンボルのバイナリコードのみを規定しているが、このバイナリコードがどのように格納されるべきかを規定していないことに注意してください.このような問題は,コンピュータが符号化がunicodeなのかasciiなのか分からないことである.その後unicodeには多くのストレージ方式が現れた.
4、utf-8
UTF-8はインターネット上で最も広く使われているunicodeの実現方式である.他の実施形態にはUTF−16およびUTF−32も含まれるが、インターネット上ではほとんど使用されない.繰り返しますが、ここでの関係は、UTF-8がUnicodeの実現方式の一つです.
utf-8とunicodeは互いに変換することができ、例えば、漢字「厳」のUnicodeコードは4 E 25(100111000100101)、UTF-8コードはE 4 B 8 A 5(11100100 10111000 10100101)である.
Windowsの下で、最も簡単な変換方法は手帳です.メモ帳でファイルを開くと、ファイルが保存され、一番下の「符号化」で符号化記憶方式を変更できます.
次のようになります.
1)ANSIはデフォルトの符号化方式である.英語ファイルについてはASCII符号化、簡体字中国語ファイルについてはGB 2312符号化である.
2)Unicode符号化とは、UCS-2符号化方式、すなわち文字を2バイトで直接格納するUnicode符号をいう.このオプションはlittle endian形式で使用されます.
3)Unicode big endian符号化は前のオプションに対応する.次の節ではlittle endianとbig endianの意味を説明します.
4)UTF-8符号化、すなわち前節で述べた符号化方法.
===========python符号化==========
python内部はunicode符号化であり、すなわち通常、pythonはunicodeを変換中間量として用い、decodeは他の符号化文字列をunicodeに変換し、次いでencodeはunicode符号化を他の符号化に変換する役割を果たす.例:
# -*- coding: utf-8 -*-

s=" "#  UTF-8 , UTF-8
u=s.decode("utf-8")		#  utf-8 str unicode
g=u.encode('gbk')		#  unicode str, GBK
print type(s),"len=",len(s)	#  : len= 6,utf-8 3 
print type(u),"len=",len(u)	#  : len= 6,unicode 
print type(g),"len=",len(g)	#  :g = u.encode(‘GBK‘),GBK 2 
print s				#  GBK/ANSI ( Windows), ,# GBK;
print g				#  Windows “ ”

ss = ' '.decode('utf-8')
print ss
print type(ss)

出力:
これにより,文字列utf−8とunicの相互変換と内部記憶符号化が見られる.
==================
まとめ:
unicodeはすべての文字の統一符号化をサポートするが、一般的には作文字の内部表示だけで、ファイル、ウェブページ(ファイルでもある)、画面入出力などに具体的な外在符号化を使用する必要がある.例えば、GBK、UTF-8などである.
encodeとdecodeはいずれもunicodeに対して「符号化」と「復号」を行うため、encodeはunicode->strのプロセスであり、decodeはstr->unicodeのプロセスである.
unicodeとstrは双子の兄弟でbasestringから来たのでisinstance(s,basestring)でsが文字列であるかどうかを判断します.