Python中国語コードの深い解析

3275 ワード

中国語の符号化問題は中国語のプログラマーがよく頭の大きい問題であり、pythonの下でもそうであるが、pythonの符号化問題をどのように理解し、解決すればよいのだろうか.
pythonの内部ではunicode符号化が使用されているが、外部では奇妙な様々な符号化に直面しなければならない.例えば、中国のプログラムとしてよく直面するgbk、gb 2312、utf 8など、これらの符号化はどのように内部のunicodeに変換されるのだろうか.
まず、ソースファイルで文字列が使用されている場合を見てみましょう.ソースファイルはテキストファイルとして必然的に何らかの符号化形式でコードを格納し、pythonはデフォルトでソースファイルがasci符号化であると考えられます.例えば、コードに変数の付与があります.
s1=’a’ 
print s1

 
pythonは、この「a」がasci符号化された文字であると考えている.英語の文字だけを使う場合はすべて正常ですが、中国語を使うと、例えば:
s1=’ ’ 
print s1

 
このコードファイルが実行されるとエラーが発生します.コードに問題があります.pythonはデフォルトでコードファイルの内容をasci符号化処理としていますが、asci符号化には中国語が存在しないため、例外が投げ出されます.
問題を解決する方法はpythonにファイルで使用されている符号化形式を知らせることであり、中国語で使用できる一般的な符号化はutf-8、gbk、gb 2312などである.コードファイルの先頭に次のように追加するだけです.
# -*- coding: utf-8 -*-

 
これはpythonに私のこのファイルのテキストがutf-8で符号化されていることを知らせて、このようにpythonはutf-8の符号化の形式に従ってその中の文字を解読して、それからunicode符号化の内部処理に変換して使用します.
ただし、Windowsコンソールの下でこのコードを実行すると、プログラムは実行されますが、画面に印刷されるのはハ字ではありません.これはpython符号化とコンソール符号化の不一致によるものである.
Windowsの下のコンソールではgbkが符号化されていますが、コードで使用されているutf-8ではpythonがutf-8符号化でgbk符号化されたコンソールに印刷されると自然に一致せず、正しい漢字が印刷できません.
解決策の1つは、ソースコードの符号化もgbkに変更することであり、つまりコードの最初の行を変更することである.
# -*- coding: gbk -*-

 
もう1つの方法は、ソースファイルのutf-8を一定に保つのではなく、「ハ」の前にu字、すなわち、
s1=u’ ’ 
print s1

 
これで「ハ」の字が正しく印刷されます.
ここで、このuは、後述する文字列をunicode形式で格納することを示す.pythonは、コードの最初の行の公称utf-8に基づいて識別コードの漢字「ハ」を符号化し、unicodeオブジェクトに変換します.typeで「ハ」のデータクラスを調べてみると
型type(‘ハ’)は、得られますが、type(u’ハ’)は、得られます.つまり、文字の前にuを付けると、unicodeオブジェクトであることを示します.この字はunicode形式でメモリに存在し、uを付けないと
これは、ソースファイルの符号化に対するpythonの識別に依存する符号化された文字列にすぎないことを示しています.ここでutf-8です.
 
Pythonは、コンソールにunicodeオブジェクトを出力する際に自動的に出力環境の符号化に従って変換されますが、unicodeオブジェクトではなく通常の文字列を出力すると、文字列の符号化に従って文字列が出力され、上記のように表示されます
象.
 
unicodeクラス、encode、decode
unicodeオブジェクトを使用する場合は、このようにuタグを使用するほか、unicodeクラスや文字列のencodeメソッドやdecodeメソッドを使用することもできます.
unicodeクラスのコンストラクション関数は、文字列パラメータと符号化パラメータを受け入れ、文字列をunicodeにカプセル化します.たとえば、ここではutf-8符号化を使用しているため、unicodeの符号化パラメータは「utf-8」を使用して文字をカプセル化します.
Unicodeオブジェクトをコンソールに正しく出力します.
s1=unicode(‘ ’, ‘utf-8′) 
print s1

 
また、decode関数を使用して、通常の文字列をunicodeオブジェクトに変換することもできます.python文字列のdecodeとencode関数がどういう意味なのか分からない人が多い.ここで簡単に説明します.
decodeは、通常の文字列をパラメータの符号化フォーマットに従って解析し、対応するunicodeオブジェクトを生成します.たとえば、ここでコードがutf-8を使用している場合、1つの文字列をunicodeに変換すると、次のような形式になります.
s2=’ ’.decode(‘utf-8′)

 
このとき,s 2は「ハ」の字を格納したunicodeオブジェクトであり,実際にはunicode(『ハ』,『utf-8’)およびu’ハ」と同じである.
では、encodeは正反対の機能であり、unicodeオブジェクトをパラメータ内の符号化フォーマットの普通の文字に変換します.例えば、次のコードです.
s3=unicode(‘ ’, ‘utf-8′).encode(‘utf-8′)

 
s 3は今またutf-8の「ハ」に戻った.
転載先:https://www.cnblogs.com/djangochina/articles/3160930.html