文字コード Python

Python学習【365日チャレンジ!】233日目のマスターU(@Udemy11)です。

少し前の話なんですが、ふと庭を見渡していたときに気がついたことがありました。

一本だけ新芽が全く出ていない木がありました。

「なぜなんだろうな?」と思いながらよ〜く観察すると、枝の先からぶら下がっているものがたくさんありました。

それがミノムシ。

あっちもこっちもそこら中にあるのですが、秋の風物詩的なイメージがあって、葉っぱを食べているという意識が抜け落ちていました。

早速プチプチちぎって駆除していくと、あら不思議数週間で新芽がたくさん出てきて、今では葉っぱもたくさん伸びています。

それでは、今日もPython学習をはじめましょう。

昨日の復習

昨日は、文字コードの基本であるASCIIコードについて学習しました。

ASCIIコードは英数字をコンピューターが理解できる2進数に変換した対応表で、人間がわかりやすいように16進数にも変換することができました。

ord()hex()bin()を使って文字を10進数や16進数、2進数に変換することができました。

詳細については、昨日の記事をごらんになってみてください。

今日は、Shift-JIS、Unicode、UTF-8について学習します。

Shift-JIS

ASCIIコードには、日本語がありませんでした。

Shift-JISは、ASCIIコードに漢字やひらがな、カタカナなどを追加した文字符号化方式で、日本語に非常に馴染みの深い文字コードです。

Pythonで文字をShift-JISに変換してみましょう

items = ['あ', 'ぁ', '日', '月']

h = []
for i in items:
   h.append(i.encode('shift-jis'))
print(h)

リストitemに、の文字を入れてforループで一つづつShift-JISにエンコードしたものを空のリストhに入れて最後にリストhを出力しています。

出力結果

[b'\x82\xa0', b'\x82\x9f', b'\x93\xfa', b'\x8c\x8e']

先頭のbは、bytes型という意味で、\xは、次に続く2文字が16進数であるという意味です。

つまり、は、82a0829f93fa8c8eに対応しています。

この16進数を2進数に変更してみます。

h = [0x82a0, 0x829f, 0x93fa, 0x8c8e]

for i in h:
   print(bin(i))

先程の16進数のコードの先頭に、16進数を意味する0xをつけて2進数に変換します。

出力結果

0b1000001010100000
0b1000001010011111
0b1001001111111010
0b1000110010001110

先頭に2進数を表す0bがついて、16桁の2進数に変換されます。

Unicode

日本語の代表的な対応表がShift-JISですが、世界中にそれぞれの言語の対応表があるわけで、それを統一したものがUnicodeになります。

ただし、Unicodeは、世界中の言語を単一文字集合として扱うための符号化文字集合規格なので、その規格を対応表に落として符号化する必要が出てきます。

重要なポイントは、Unicodeは、符号化文字集合で、文字符号化方式ではないということです。

UTF-8

符号化文字集合であるUnicodeにあった文字符号化方式の一つがUTF-8で、ほとんどのコンピューターのデフォルトエンコードがUTF-8になっています。

つまり、世界中のあらゆる文字に対応した文字コードがUTF-8ということです。

a = 'あ'
print(a.encode())
print(a.encode('utf-8'))
print(bin(0xe38182))

出力結果

b'\xe3\x81\x82'
b'\xe3\x81\x82'
0b111000111000000110000010

1行目でaに代入して、2行目でデフォルトの文字コードを使ってをエンコードして出力しています。

3行目は、文字コードをutf-8に指定して、を出力しています。

出力結果は、どちらも同じ担っていますので、デフォルトの文字コードがutf-8だということがわかります。

最後の4行目は、utf-8に対応したの16進数のコードを2進数に変換しています。

UTF-8の場合、16進数の6桁で表現しているので、24bitつまり、3byteのデータで1つの文字を表していることになります。世界中の言語を統一した文字コードには、かなりのデータ量が必要だということですね。

エンコードが理解できる

エクセルやワードを使っていて、日本語の外字を表示するために文字パレットを使って対応表に登録された経験があればわかりますが、保存したデータを他のPCに持っていくと文字化けして表示されます。

自分のパソコンだけには、空いている文字コードに追記できますが、他のパソコンでは、空欄だったりちがう文字が入っていたりします。

文字コードについて、きちんと理解でいれば、なぜ文字化けするのかとか、登録した文字がなくなっていたりすることも理解できるようになります。

ちょっととっつきづらい内容ですが、分かれば、考え方が一気にクリアになるので、ぜひしっかりと文字コードを理解できるようになりましょう!

それでは明日もGood