3秒でわかる
Unicode がすべての文字に割り当てた通し番号のこと。文字化けや文字数の数え違いを追いかけるときの手がかりになります。
もう少し詳しく
どういうものか
コードポイントは、Unicode が世界中の文字それぞれに割り当てた整数の番号を指す。A は 65、あ は 12354 で、慣習として十六進数を用い U+0041 U+3042 と書く。文字そのものと番号の対応表がコードポイントで、その番号を実際のバイト列としてどう並べるかは UTF-8 などの符号化方式が決める。この二段構えを分けて考えられるかどうかが理解の分かれ目になる。
なぜ必要か
コンピュータが直接扱えるのは数値だけなので、文字を保存するには番号を決める必要がある。かつては言語圏ごとに別々の対応表が使われ、日本語の文書を海外の環境で開くと壊れる状態が続いていた。Unicode がすべての文字に重複しない番号を振ったことで、絵文字も含めて同じ文書に混在させられるようになった。
具体例
print(ord("A")) # 65
print(hex(ord("あ"))) # 0x3042
print(chr(0x3042)) # あ
s = "あ"
print(len(s)) # 1 文字としての長さ
print(len(s.encode("utf-8"))) # 3 UTF-8 でのバイト数番号とバイト列の関係は次のようになる。
文字 あ
番号 U+3042
UTF-8 E3 81 82 (3 バイト)
UTF-16 30 42 (2 バイト)つまずきやすいところ
文字数とバイト数を混同すると、DB の桁あふれや途中で切れた文字列が生まれる。VARCHAR(10) が文字数かバイト数かは環境によって違うため、日本語を入れる前に確認しておく。もう一つ、絵文字や一部の漢字はコードポイントが U+FFFF を超え、UTF-16 を採用する JavaScript や Java では 1 文字が 2 単位として数えられる。"𠮷".length が 2 を返すのはこのためで、1 文字ずつ切り出す処理が壊れる原因になる。
覚え方
コードポイントは文字の背番号で、UTF-8 はその背番号を紙に書くときの書式にあたる。番号と書式は別物と押さえておくと、文字化けの原因をどちらの層で探せばよいか見当がつく。
似た用語との違い
| 用語 | 何を決めるか |
|---|---|
| コードポイント | 文字に対応する番号そのもの |
| 文字コード (符号化方式) | その番号をバイト列としてどう並べるか |
| フォント | その文字をどんな形で表示するか |
文字化けは符号化方式の食い違い、豆腐状の四角はフォントに字形が無い状態になる。症状で原因の層を切り分けられる。