python 2中国語符号化問題のまとめ

4276 ワード

最近中国語のデータを処理して、python 2の各種の符号化の問題、多くのブログと文章を見て、ついにいくつか理解して、だからここで1発まとめます.皆さんの勉強と参考に供します!
1.コード化
(1)ASCIIコード
ASCIIコードは、英語文字をデジタル記憶に変換する最初のコンピュータシステムを規定した符号化方式で、128文字の符号化、すなわち7ビットを規定している.一方、1 byte=8 bitであるため、1バイトを占めるASCIIコードの最上位(未使用)は0となる.
(2)Unicode
ASCIIコードには大文字と小文字の英字、数字、いくつかの記号しか含まれていないため、他の言語を表す場合はだめです.従って、いくつかの非ASCII符号化方式が生成される.
簡体字中国語の一般的な符号化方式はGB 2312で、2バイトで1つの漢字を表すので、理論的には256 x 256=65536個の記号を表すことができる.
しかし、地方ごとに符号化基準が異なり、どのように統一されているのでしょうか.Unicodeが現れました
Unicodeは万国コードと呼ばれ、32ビットバイナリ(4バイト)で1文字を表す.ただし、Unicodeはシンボルセット(指定文字からバイナリ数までの対応関係)にすぎず、シンボルのバイナリコードのみを規定しているが、このバイナリコードがどのように格納されるべきかは規定されていないことに注意してください.
(3)UTF-8
Unicodeの実現方法はいろいろあります.例えば
  • UTF-8:(長くなる符号化方式は、1つの記号を2~4バイトで表すことができ、異なる記号によってバイト長が変化する)
  • .
  • UTF-16:(長くなる符号化方式は、1つの符号を2~4バイトで表すことができ、異なる符号によってバイト長が変化する)
  • .
  • UTF-32:(各文字固定4バイト)
  • UTF-8(8-bit Unicode Transformation Format)はインターネット上で最も広く使われているUnicodeの実現方式である.
    2.Pythonコード
    python 2はデフォルトでASCIIで符号化されていますが、実際の符号化では多くの中国語を使用します.中国語を含むプログラムが間違っていないように、国際的な慣例に合致するために、一般的に私たちのファイル符号化をutf-8形式に設定します.設定方法:一般的にファイルの先頭で宣言
     # -*- coding:utf-8 -*-

    Pythonにはbasestringから派生した文字列を表す2つのタイプがあります.str,unicodeです.ここでstrはCの文字配列やJavaのbyte配列に似ている.unicodeタイプの場合、Pythonはメモリに格納して使用する場合、UTF-8方式でコードの文字列にuを加算します.
    一方unicodeとstr間の変換では,encodeとdeocde法が用いられる.decode復号:1つの(str)文字列を所与の符号化に従ってunicodeタイプに解析することを表し、encode符号化:1つのunicode文字列を指定の符号化に従ってバイト配列(str)に解析することを表す
    3.sys.setdefaultencoding(‘utf-8’)問題
    なぜ私たちは時々符号化の問題に遭遇する時、reload(sys)、sysを解決する方法をよく見ます.setdefaultencoding(‘utf-8’) ?
    ここで私は1篇のブログを見て、言うのはとても良くて、ここでこの仁兄に感謝して、私はコピーして貼ってみんなに膜拝します:pythonの中でsys.setdefaultencoding(‘utf-8’)の役割
    strオブジェクトがencodeを呼び出すと、デフォルトでシステムのデフォルト符号化方式でdecodeがunicodeオブジェクトになってからencodeが呼び出され、中間デフォルトのdecodeが無視されると、エラーが発生することが多い.たとえば、次のコードがあります.
      # -*- coding: utf-8 -*- 
      s = '    '  #     str   str    ,    unicode 
      s.encode('gb2312') 

    このコードは、sをgb 2312のフォーマットに再符号化し、すなわちunicode->strの変換を行う.s自体がstrタイプであるため、Pythonは自動的にsをunicodeに復号してからgb 2312に符号化する.復号はpythonが自動的に行うので、復号方式を指定していないので、pythonはsysを使用します.defaultencodingは、復号化の方法を示す.多くの場合sys.defaultencodingはANSCIIで、sがこのタイプでないとエラーになります.
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 
      0: ordinal not in range(128) 

    この場合,誤りを修正するには,(1)sの符号化方式を明確に示す2つの方法がある.
     #! /usr/bin/env python 
      # -*- coding: utf-8 -*- 
      s = '    ' 
      s.decode('utf-8').encode('gb2312') 

    (2)sysを変更する.defaultencodingファイルの符号化方式
      # -*- coding: utf-8 -*- 
      import sys 
      reload(sys) # Python2.5         sys.setdefaultencoding   ,         
      sys.setdefaultencoding('utf-8') 
    
      str = '    ' 
      str.encode('gb2312')

    まとめ:
    1.符号化の問題はpython 2の中でやはり面倒で、特に中国語を処理して、中の穴はたぶん私はすべて出会ったことがあります.まずcodingの言葉をつけることをお勧めします.ついでにreloadも追加しましょう.このようにして、後でプログラムが間違っていることを避けて、また問題を探しに来ます.(私もreload(sys)があまりよくないという記事を見たことがありますが、実は一番いい方法はpython 3を交換することだと思います^^)2.UnicodeとUTF-8の関係を理解する(実現方式のみ).3.pythonでencodeを符号化し、decodeを復号するのは何をしているのかを理解します.strからunicodeは復号であり、unicodeからstrは符号化である.あるstrが別のstrに渡されると、システムのデフォルト方式decodeで復号され、encode符号化されます.
    参考ブログ:チェン一峰-文字コードノート:ASCII、UnicodeとUTF-8(素晴らしいですね!私の多くのところは彼のブログを見て分かりました)Python 2のコードについて話しますこの文章encode、decodeははっきり書いていますね~しかもとても分かりやすくて、おじいさんを拝みます~