文字コードに関するおすすめの記事 文字列 - Dive Into Python 3
Unicode と個別のエンコーディング方式(UCS-2,UCS-4,UTF-8,UTF-16)の違いを意識するのは大事
-
Unicode は文字の集合.世界中の文字や絵文字などをすべて含む(のを目標にして拡張が続いている)
-
エンコーディング方式は,Unicode 文字をメモリやディスクに格納するためにバイト列に変換する方法
Unicode 文字 -- [encode] --> バイト列
-
それぞれの Unicode 文字には「コードポイント」が割り振られている
- 'A' は U+0041
- '愛' は U+611B
-
コードポイントは上位バイトから群,面,区,点と呼ばれる
- 'A' は 00 群 00 面 00 区に存在する文字
- '愛' は 00 群 00 面 61 区に存在する文字
-
コードポイントをバイト列に変換するのがエンコーディング方式
-
UCS-4 = UTF-32 は 4 バイトで 1 文字を表す.すべての Unicode 文字を完全に表現できる.
-
UCS-2 は 2 バイトで 1 文字を表す.ちょうど UCS-4 の下位 2 バイトを取り出した形.00 群 00 面の文字を表すためのエンコーディング.
UCS-2 は約 6 万文字も表すことができるため,世界中の文字を表せると思われていた.しかし,実際はそれでは足りないことが分かった.
UTF-16 は UCS-2 にサロゲートペアという概念を加えたもの.サロゲートペアは,当時 UCS-2 で未使用だった 0xD800~0xDBFF を「上位サロゲート」,0xDC00~0xDFFF を「下位サロゲート」として,計 4 バイトで 1 文字を表すやり方.約 100 万文字が追加で定義できるようになった.コードポイント U+10FFFF まで表せるようになった.
UTF-8 は可変長のエンコーディング方式.ASCII の範囲は 1 バイトで表せる.エンディアンの違いも考慮する必要がない.
UCS-4 でエンコードすれば必ず「1 文字 = 4 バイト」となるのだろうか?
「愛」は明らかに 1 文字.では「が」は?「か + 濁点」で表そうとすると 8 バイトが必要だ.
- 異体字セレクタ
- 概念的に同じ文字の違う字体を選ぶための機能
- かつしかく = 葛,かつらぎし = 葛
- ゼロ幅接合子
- 本来分離してしまう文字同士をくっつけるもの
- 絵文字に適用すると,別の絵文字になることがある
- 2 人の大人の絵文字 + 1 人または 2 人の子どもの絵文字 = 家族の絵文字
- ゼロ幅非接合子
- 合字:fl や fi で文字がくっつくこと
- ゼロ幅非接合子:合字にしないために挿入するもの
- 合字は形態素境界をまたいではいけない
- 単独の fly や fish では合字になる
- dayfly や catfish は day + fly,cat + fish なので,fl や fi は合字になる
- deefly や selfish は接尾辞の ly や ish なので fl と fi は合字にしてはならない
- 制御文字
- RIGHT-TO-LEFT EMBEDDING U+202B