pythonの符号化変換unicode,utf-8,utf-16,GBK

7772 ワード

主にpythonの符号化メカニズム,unicode,utf-8,utf-16,GBK,GB 2312,ISO-8859-1などの符号化間の変換を紹介した.
一般的なエンコーディング変換には、次のようなケースがあります.
自動認識文字列エンコーディング
chardetモジュールを使用して文字創符号化を自動的に識別できます
chardetの使い方
unicodeは他の符号化に変換される(GBK,GB 2312等)
例えば、aがunicode符号化である場合、gb 2312に変換される.a.encode('gb2312')
# -*- coding=gb2312 -*-
a = u"  "
a_gb2312 = a.encode('gb2312')
print a_gb2312

GBKとGB 2312の違い
GBコードは、全称GB 2312-80「情報交換用漢字符号化文字セット基本セット」で、1980年に発表され、中国語情報処理の国家標準であり、大陸や海外で簡体字中国語を使用する地域(シンガポールなど)で強制的に使用される唯一の中国語符号化である.P- Windows3.2とアップルOSはGB 2312を基本漢字符号化し、Windows 95/98はGBKを基本漢字符号化しているが、GB 2312に対応している.GBコードには6763個の簡体字、682個の記号が収録されており、そのうち漢字部分は1級字3755、ピンインで並べ替えられ、2級字3008、偏旁で並べ替えられている.この基準の制定と応用は中国語情報化プロセスを規範化し、推進するために大きな役割を果たした.
GBKコードは中国大陸で制定されたUCSに等しい新しい中国語コード拡張国家標準である.GBKワークグループは1995年10月、同年12月にGBK規範を完成した.この符号化規格はGB 2312と互換性があり、漢字21003個、記号883個を収録し、1894個の造字符号ビットを提供し、簡、繁体字がライブラリに溶け込んでいる.
GBKはGB 2312のすべての符号化を含み、一部の字GB 2312はなく、GBKで符号化する必要がある.
回転:gbk,gb 2312,big 5,unicode,utf-8,utf-16の違い
その他の符号化(utf-8,GBK)はunicodeに変換される
例えば、aはgb 2312の符号化であり、unicodeに移行する.unicode(a,'gb 2312')またはa.decode('gb 2312')
# -*- coding=gb2312 -*-
a = u"  "
a_gb2312 = a.encode('gb2312')
print a_gb2312
 
a_unicode = a_gb2312.decode('gb2312')
assert(a_unicode == a)
a_utf_8 = a_unicode.encode('utf-8')
print a_utf_8

非unicode符号化間の変換
符号化1(GBK,GB 2312)は、符号化2(utf-8,utf-16,ISO-8859-1)に変換される
まずunicodeに変換してから符号化2に変換できます.
例えばgb 2312回転utf-8
# -*- coding=gb2312 -*-
a = u"  "
a_gb2312 = a.encode('gb2312')
print a_gb2312
 
a_unicode = a_gb2312.decode('gb2312')
assert(a_unicode == a)
a_utf_8 = a_unicode.encode('utf-8')
print a_utf_8

判定文字列の符号化
isinstance(s,str)は、一般文字列isinstance(s,unicode)であるかどうかを判断するために使用され、unicodeであるかどうかを判断するために使用されます.1つの文字列がunicodeである場合、unicode変換を実行するとエラーが発生することがあります(エラーはありません).
次のコードは、任意の文字列をunicodeに変換することです.
def u(s, encoding):
    if isinstance(s, unicode):
        return s
    else:
        return unicode(s, encoding)

unicodeと他の符号化の違い
なぜすべてのファイルがunicodeではなく、GBK、utf-8などの符号化が必要なのでしょうか.
unicodeは抽象符号化と呼ぶことができ,すなわち内部表現にすぎず,一般に直接保存できない.ディスクに保存する場合は、utf-8やutf-16などの対応する符号化に変換する必要があります.
その他の方法
以上の符号化方法に加えて、ファイルの読み書き時にcodecsのopen方法を用いて読み書き時に変換することもできる.
コマンドラインのデフォルトエンコード検出と設定
pythonが付属するモジュールlocaleを使用して、コマンドラインのデフォルト符号化を検出し、コマンドライン符号化を設定できます.
import locale
 
#get 
locale.getdefaultlocale()
#('zh_CN', 'cp936')
 
#set
locale.setlocale(...)

漢字変換Unicode符号化
    pd_name = pd_name.decode('utf-8')
    print pd_name
    nname = ""
    for c in pd_name:
      c = "%%u%04X" % ord(c);
      nname += c