「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。目下、データ分析・語学に力点を置いています。

MENU

Pythonをゆっくりていねいに学ぶ(その17/X)

 Pythonを真面目にゆっくり学ぶべく

を参考に学んでいきます*1

7. プロのようにデータを操る

7.1 文字列

7.1.1 Unicode

 \mathrm{Unicode}は世界の言語のすべての文字と数学、その他の分野の記号を定義しようという発展途上の国際標準である。\mathrm{Python\ 3}の文字列は\mathrm{Unicode}文字列で、バイト列ではない。

  • \uの後ろに4個の16進数を続けたものは、256の基本他言語面のいずれかに含まれる文字に対応する。最初の2桁は面番号、後半の2桁はその面の中での文字インデックスを表す。
  • 上位面の文字は、基本多言語面の文字よりも多くのビットを必要とする。
  • すべての文字列について、\N{name}を用いると、標準の名前を通じて一つの文字を指定できる。

 \mathrm{Python}\mathrm{unicodedata}モジュールには双方向の変換関数が含まれる。

#####################
### 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つを行なう必要がある。

  • 文字列をバイト列にエンコードする
  • バイト列を文字列にデコードする

これらを効率的に行う仕組みが\mathrm{UTF}-8である。

###################################
### 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')


 デコードで問題なのは、デコード対象の文字列がどのエンコーディングで生成されているかである。可能な限り、\mathrm{UTF}-8を用いるのが望ましい。

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版が出ているものの初版しか持っていないのでこちらで。

プライバシーポリシー お問い合わせ