7.1 文字列
7.1.1 Unicode
-
コンピュータの記憶の基本単位はバイトで、8個のビットを使って256種類の一意な値を表現できる。
- ビット:2進数(0と1、バイナリ)で表した数字の桁数。4ビットは4桁、8ビットは8桁の2進数であり、それぞれ2の4乗(16)、2の8乗(256)通りの数字を表せる。
- バイト:8ビットで1バイト。1バイトを表すのに16進数を使うと分かりやすい。
Unicodeは世界の言語の全ての文学と数学、そのほかの分野の記号を定義しようという発展途上の国際標準。
7.1.1.1 Python 3のUnicode文字列
- Python3の文字列はUnicode文字列であり、バイト列ではない。
- 文字のUnicode IDまたは名前を知っている場合、Python文字列でそれを使うことができる。
- Pythonのunicodedataモジュールには双方向ほ変換関数が含まれている。
- lookup():名前(大文字と小文字を区別しない)を与えると、Unicode文字が返される。
- name():Unicode文字を与えると、大文字の名前が返される。
>>> def unicode_test(v):
... import unicodedata
#文字から名前を引き出す
... name=unicodedata.name(v)
#名前から文字列を引き出す。
... v2=unicodedata.lookup(name)
... print("v=%s,name=%s,v2=%s"%(v,name,v2))
...
>>> unicode_test("A")
v=A,name=LATIN CAPITAL LETTER A,v2=A
#UnicodeのASCII記号
>>> unicode_test("$")
v=$,name=DOLLAR SIGN,v2=$
#Unicodeの通貨記号
>>> unicode_test("\u00a2")
v=¢,name=CENT SIGN,v2=¢
>>> unicode_test("\u20ac")
v=€,name=EURO SIGN,v2=€
#代替記号の表示
>>> unicode_test("\u2603")
v=☃,name=SNOWMAN,v2=☃
>>> place = "cafe"
>>> place
'cafe'
>>> import unicodedata
>>> unicodedata.name('\u00e9')
'LATIN SMALL LETTER E WITH ACUTE'
>>> unicodedata.lookup('LATIN SMALL LETTER E WITH ACUTE')
'é'
#コードにより文字列指定
>>> place = "caf\u00e9"
>>> place
'café'
#名前により文字列指定
>>> place = "caf\N{LATIN SMALL LETTER E WITH ACUTE}"
>>> place
'café'
>>> u="\N{LATIN SMALL LETTER U WITH DIAERESIS}"
>>> u
'ü'
#len()はバイト数ではなく、Unicodeの文字数を数える。
>>> len("&")
1
>>> len("\U0001f47b")
1
感想
エンコーディングやデコーディング、バイト列等聞いた覚えがないような言葉が結構出てきた。一つ一つ調べながらやろう。
参考文献
「Bill Lubanovic著 『入門 Python3』(オライリージャパン発行)」