Unicode†
文字集合(抽象的なもの) : 現在は 32bit で表現する
理論上、4294967296文字 ( = 42億文字 ) 表現可能だが、半分のビット+アルファ程度しか使われない
1文字を U+xxxx か U+Axxxx のようなコードで表す
A の部分は面と呼ばれ、U+xxxx のように4ケタのものは0面のこと
(0面は 16bit あるので 65536文字扱える)
「あ」: U+3042
- unicode での「面」は 16面まであり、その上位概念の「群」は使用しない
- 0面の D800-DFFF は後述のサロゲートペアに使用されるため、文字は割当たっていない
UTF-8/UTF-16/UTF-32†
エンコーディング : Unicode をどう実装しているか
8/16/32 はビット処理の単位 = その単位で1文字を表す
1単位で足りない場合は2個セットで1文字、3個セットで1文字のように伸びる
UTF-32 の場合は Unicode 空間全てを表現できるので必ず1文字 32bit
(ただし a 等のどんなに簡単な文字でも必ず 32bitを使ってしまうため、同じテキストでも容量を食ってしまうという欠点がある)
基本的なもの†
A |
Unicode | U+0041 | | |
UTF-8 | 41 | | |
UTF-16 | 4100 | | |
HTML | A | | |
Д |
Unicode | U+0414 | | |
UTF-8 | D0 94 | | |
UTF-16 | 1404 | | |
HTML | Д | | |
「あ」 |
Unicode | U+3042 | | |
UTF-8 | E3 81 82 | perl/php | |
UTF-16 | 4230 | java | byteorder で 30 と 42 が逆 |
HTML | あ | | unicode の数値そのまま |
UTF-16 サロゲートペア†
UTF-16に限り、16bit で足りないものはサロゲートペア(つまり2文字分で1文字を表現)を使用する
(Unicode で U+10000 ~ U+10FFFF の範囲のもの)
D800-DBFF の範囲の1文字分と DC00-DFFF の範囲の1文字を組み合わせ、1024X1024=104万文字を表現
「𠮟」 |
Unicode | U+20B9F | | |
UTF-8 | F0 A0 AE 0F | perl/php | mysql では utf8mb4 のテーブルじゃないとダメ |
UTF-16 | D842 DF9F | java | |
HTML | 𠮟/𠮟 | | unicode の数値そのまま |
- android などでフォントが対応していないと表示できない
UTF-8 BOM†
UTF-8 にはテキストファイルの先頭に3バイトのマーカーをつけて、そのファイルがUTF-8であることを示す。この3バイトを BOM と呼ぶ
EF BB BF
Excel では CSV ファイルを読み込むときは、BOM 付 UTF-8 のみ判定可能。
その他の場合は SJIS とみなすため、文字化けする
- 日本独自の文化だが、UTF-8(BOMあり) / UTF-8N(BOMなし) と表現する場合がある
環境依存文字†
Windows のみで表示されるもの(だった)
?とか
くさなぎの「なぎ」など
?
環境依存文字(Unicode)†
JIS2004 などで追加され、Unicode でのみ表現できるもの
JIS2004†
304 文字がサロゲートペアの範囲に
その他が2バイトの範囲に!
SJIS では表示できない
塡 | (窒素充填の「てん」の旧字) |
Unicode | U+5861 | | |
UTF-8 | E5 A1 A1 | perl/php | |
UTF-16 | D842 DF9F | java | |
HTML | 塡 | | unicode の数値そのまま |
IVS†
葛飾の「かつ」は葛城市の「かつ」と別の字形を使う
渡邊 の「なベ」は17種類ある U+908A + (U+E0100 〜 U+E01xx)
これを出し分ける際には Unicode で2文字分(=64bit!)つかう
(まだ対応してるフォントは少ないので使えないけど)
葛 |
Unicode | U+908A U+E0110 |
UTF-8 | E9 82 8A F3 A0 84 80 |
UTF-16 | 908A DB40 DD00 |
結合文字†
2文字以上の文字を重ね合わせて1文字として出す文字
キモい顔文字で使われる
か゚ とか
U+304B U+309A
ま゚
JAVA の文字コード†
ややこしいが、java で UTF-16 を使っているという意味は、内部処理で UTF-16を使っている(String) ということであり、.java 自体は UTF-8 で記述する(ことが多い)
ちなみにファイルを扱う際には BOM を認識しないので、UTF-8(BOM付) のファイルの扱い時は注意すること
参考文献†
http://itpro.nikkeibp.co.jp/article/COLUMN/20091209/341831/
http://www.excite.co.jp/News/bit/E1351498844494.html