文字コード入門
松木雅幸
Oct 21st, 2011
アジェンダ
文字コードとは?
UNICODE
UNICODEの問題点
文字コードとは?
文字集合と符号化方式
両者が一緒になっていることも
文字集合
ASCII
JIS第1第2水準 (JIS X 0208)
JIS X 0212
JIS X 0213
UNICODE
符号化形式
ISO-2022-JP
Shift_JIS
EUC-JP
UTF-16
UTF-8
符号化形式の変遷
7ビット符号系(ISO-2022 エスケープシーケンス切り替え 壊れやすい)
8ビット符号系(0-127 128-255)
非ASCII部分を2バイト
全部2バイト(UTF-16)
可変長
日本語の文字コード
ISO-2022-JP系
Shift_JIS系
EUC-JP系
ISO-2022-JP系
7bit符号系
JIS X 0208とか
メールで使われる
半角カナが含まれない
Shift_JIS系
JIS X 0208
いろんなベンダーで使われて、独自拡張されてわけわからないことに
Windows31J(cp932)がデファクト
Perlだとcp932。PHPだとSJIS-win
ただしcp932はShift_JISの上位互換では無い(WaveDash問題)
マルチバイトの2バイト目にASCIIレンジが入ってくることがある(5C問題)
半角カナが1バイト
EUC-JP系
JIS X 0208
UNIXとかで使われていた
半角カナが2バイト
これも色々拡張がある
cp51932とeucjp-msの非互換問題
perl: cp51932 eucJP-ms
PHP: CP51932 eucJP-win
PerlだとEncode::EUCJMSモジュールの追加インストールが必要
http://msyk.at.webry.info/200511/article_2.html
UNICODEの符号化形式
UTF-16(愚直・サロゲートペア問題)
UTF-8(スマート)
𠮟(≠「叱」)
UTF-8の符号化方式
可変長
先頭バイトは0もしくは11から始まる
最初にどこに0が出てくるかでバイト数が決まる
後続のバイトの先頭2ビットが10
非常にスマート。実装してみると良い
もうちょっと詳しく
先頭バイト
\x0xxxxxxx → 1バイト(ASCII)
\x110xxxxx → 2バイト
\x1110xxxx → 3バイト
\x11110xxx → 4バイト
後続バイト
\x10xxxxxx
ex. \x1110xxxx \x10xxxxxx \x10xxxxxx
現状のUnicodeの問題点
似たような字形に同じユニコード番号を割り当てている
→「似たような字形」って何? 判断基準は?
同じユニコード番号、同じ字形、違う意味
同じユニコード番号、違う字形、同じ意味
同じユニコード番号、違う字形、違う意味
違うユニコード番号、同じ字形、同じ意味
違うユニコード番号、同じ字形、違う意味
違うユニコード番号、違う字形、同じ意味
日本語と中国語(簡体字)
日本語
中文
機
机
同じ意味,違うコード,違う字形
机
几
同じ意味,違うコード,違う字形
(ただし几は別の意味で使うことが多い)
骨
骨
同じ意味,同じコード,違う字形
説
说
同じ意味,違うコード,違う字形
異体字とフォント
アプローチ
違う字形にすべて違うコードを割り当てる
代表的な字しか使わない
辺 邊 邉 ... 28
代表的な字に対して複数の異字体情報を付加する(折衷案)
=異体字セレクタ
→ Ideographic Variation DatabaseとAdobe-Japan1-6
http://www.unicode.org/ivd/
漢字は増え続けている!
例
マイトネリウム meitnerium 元素記号109番
→新しい元素が見つかるたびに、漢字を作っている!
グリフウィキ
DEMO