Pythonを真面目にゆっくり学ぶべく
を参考に学んでいきます*1。
7. プロのようにデータを操る
7.1 文字列
7.1.1 Unicode
は世界の言語のすべての文字と数学、その他の分野の記号を定義しようという発展途上の国際標準である。
の文字列は
文字列で、バイト列ではない。
- \uの後ろに4個の16進数を続けたものは、
の基本他言語面のいずれかに含まれる文字に対応する。最初の2桁は面番号、後半の2桁はその面の中での文字インデックスを表す。
- 上位面の文字は、基本多言語面の文字よりも多くのビットを必要とする。
- すべての文字列について、\N{
}を用いると、標準の名前を通じて一つの文字を指定できる。
の
モジュールには双方向の変換関数が含まれる。
##################### ### Unicode文字列 ### ##################### def unicode_test(value): import unicodedata name = unicodedata.name(value) value2 = unicodedata.lookup(name) print('value = "%s", name = "%s",\ value2 = "%s"' %(value, name, value2)) unicode_test('A') unicode_test('\u2603') unicodedata.name('\u00e9') unicodedata.lookup('LATIN SMALL LETTER E WITH ACUTE') place = 'caf\u00e9' print(place) place = 'caf\N{LATIN SMALL LETTER E WITH ACUTE}' print(place) # lenはUnicode文字の数を数える len(unicodedata.name('\u2603'))
7.1.2 UTF-8によるエンコード、デコード
外部と文字データのやり取りを行う際、以下の2つを行なう必要がある。
- 文字列をバイト列にエンコードする
- バイト列を文字列にデコードする
これらを効率的に行う仕組みが-
である。
################################### ### UTF-8によるエンコーディング ### ################################### snowman = '\u2603' print(len(snowman)) # UTF-8 ds = snowman.encode('UTF-8') print(len(ds)) print(ds) # ASCII ds2 = snowman.encode('ascii', 'ignore') # ignoreとすると、該当列がないときに空欄を返す print(ds2) # Webサイトで利用できるエンティティの文字列 snowman.encode('ascii','xmlcharrefreplace')
デコードで問題なのは、デコード対象の文字列がどのエンコーディングで生成されているかである。可能な限り、-
を用いるのが望ましい。
place = 'caf\u00e9' print(place) print(type(place)) place_bytes = place.encode('utf-8') print(place_bytes) print(type(place_bytes)) # UTF-8からUTF-8へ place2 = place_bytes.decode('utf-8') try: place3 = place_bytes.decode('ascii') except: print('エンコード形式とデコード形式が違います。')
*1:第2版が出ているものの初版しか持っていないのでこちらで。