文字コード入門 理論編 クイズ付き
DESCRIPTION
社内勉強会「文字コード入門」で使った資料です。 文字集合(Character Set)と文字エンコーディング(Character Encoding Scheme)の関係、よく使う文字エンコーディングの特徴などを取り上げました。TRANSCRIPT
文字コード入門理論編
2013/07/30baba@BPS
クイズ付き
本資料について• 本資料は、社内勉強会で使った資料です– 外部向けに書かれていない記述がある可能性
があります– 正確な解説を省いている箇所があります
• 本資料の取り扱いについて– 再配布等のご相談は [email protected] までお願
いします。
はじめに• 今回は文字コードの用語解説と基礎知識の話
です• 話さないこと– Ruby や Java や C でどのように書けば良いか、と
いった実装の話– 文字コード変換、文字化けに関する話– フォントに関する話– Unicode の細かい話– バイナリな話
• 後半にクイズがあります
目次• 文字集合と文字エンコーディング– 文字集合– 符号化文字集合– 文字符号化形式
• クイズ• ちょっと Unicode の話
文字集合と文字エンコーディング用語を理解しよう
文字集合と文字エンコーディング
• 文字集合– Character Set
• 符号化文字集合– Coded Character Set
• 文字符号化方式– Character Encoding Scheme
• 符号点– Code Point
”※ charset” は文字集合ではない
文字集合と文字エンコーディング
a あ 𠮟UnicodeCode Point
U+61 U+3042 U+209BF
JIS X 0208Code Point 3 区 65 点
※ 例示字体は全角4 区 2 点 -
ASCII 0x61 - -
Shift_JIS 0x61 0x82A0 -
UTF-8 0x61 0xE38182 0xF0A0AE9F
UTF-16 0x0061 0x3042 0xD842 0xDF9F
UTF-32 0x00000061 0x00003042 0x000209BF
文字集合• 数字– 0-9 の 10 文字
• ラテン文字– A-Z 大文字小文字の 52 文字
• ひらがな、カタカナ• ギリシア文字• 記号• 漢字
JIS の文字集合• 非漢字
– 数字、ラテン文字、記号など 約 500 文字• 第一水準
– 常用漢字のほぼすべて、人名用漢字、その他日常的に使う漢字 約 3,000 文字
• 第二水準– 動植物名漢字など 約 3,300 文字
• 第三水準– あまり使わない漢字 約 1,200 文字– でも常用漢字が含まれている
• 第四水準– あまり使わない漢字 約 2,400 文字
符号化文字集合• JIS X 0208
– JIS 第一、第二水準を含む約 6,000 文字• JIS X 0212
– JIS X 0208 に含まれない補助漢字約 6,000 文字• JIS X 0213
– JIS X 0213:2000• JIS 第一~第四水準漢字などを含む約 12,000 文字
– JIS X 0213:2004• 例示字体の変更( 1 点しんにょう→ 2 点しんにょう)• 文字の追加
– JIS X 0213:2012• 情報漢字表改定に伴うマイナーチェンジ
符号化文字集合• UCS-2– Unicode 0 面• BMP (Basic Multilingual Plane)
– U+0 ~ U+FFFF• 65536 文字分
• UCS-4– Unicode で扱うすべて– U+0 ~ U+10FFFF• 約 111 万文字分
符号化文字集合
ラテン文字
第一水準漢字
第三水準漢字第二水準漢字
第四水準漢字
数字
記号
ひらがな / カタカナ
ISO 646
UCS2
JIS X 0208JIS X 0213
ハングル
ギリシア文字
キリル文字
ヘブライ文字
ルーン文字
モンゴル文字
顔文字
古代文字
麻雀牌
錬金術記号
UCS4
JIS X 0212
文字符号化方式• ISO646
– 7bit で英数字を表現( ASCII コード)• Shift_JIS
– 1 ~ 2 バイトで日本語を表現– 日本語 Windows でよく使われる(実際は CP932 のことも多い)
• EUC-JP– 1 ~ 2 バイトで日本語を表現– 日本語 Linux でよく使われる
• ISO-8859-1– 8bit で ASCII+α を表現する( latin-1 )– 欧米でよく使われる
• ISO-2022-JP– 7bit でエスケープシーケンスを使って日本語を表現– ステートフルなエンコーディング– 日本語メールでよく使われる
文字符号化方式• UTF-8– Web でよく使われる
• UTF-16– UCS-2 と BMP 内で対応– Java, Windows, Python などの内部文字コード
• UTF-32– UCS-4 と対応– ユーザレベルではあまり使わない
クイズ
この文字エンコーディングは?• Amazon で日本語商品を表示した
• どれでしょう– Shift_JIS– UTF-8– UTF-16– Unicode Code Point
• 標準仕様? Web サイト依存?ブラウザ依存?
7bit 文字エンコーディングはどれ?
• ISO646 (ASCII)• Shift_JIS• EUC-JP• ISO-8859-1• ISO-2022-JP• UTF-8• UTF-16• UTF-32
7bit 文字エンコーディングはどれ?
• ISO646 (ASCII)• Shift_JIS• EUC-JP• ISO-8859-1• ISO-2022-JP• UTF-8• UTF-16• UTF-32
ASCII 互換エンコーディングはどれ?
• Shift_JIS• EUC-JP• ISO 8859-1• ISO-2022-JP• UTF-8• UTF-16• UTF-32
ASCII 互換エンコーディングはどれ?
• Shift_JIS• EUC-JP• ISO 8859-1• ISO-2022-JP• UTF-8• UTF-16• UTF-32
バイト数から文字数を求められるのは?
• ISO646 (ASCII)• Shift_JIS• EUC-JP• ISO 8859-1• ISO-2022-JP• UTF-8• UTF-16• UTF-32
※ 改行や BOM 、制御文字などは気にしない
バイト数から文字数を求められるのは?
• ISO646 (ASCII)• Shift_JIS• EUC-JP• ISO 8859-1• ISO-2022-JP• UTF-8• UTF-16• UTF-32 (コードポイント数は求められる)
UTF-8 で 1 文字の最大バイト数は?
• 1 バイト• 2 バイト• 3 バイト• 4 バイト• 5 バイト• 6 バイト• 7 バイト• 8 バイト• 9 バイト• それ以上
UTF-8 で 1 文字の最大バイト数は?
• 1 バイト• 2 バイト• 3 バイト• 4 バイト ( Unicode 文字が割り当てられる範囲)• 5 バイト• 6 バイト (旧 UTF-8 の規格上)• 7 バイト• 8 バイト (実用上の最大バイト数)• 9 バイト• それ以上 (合成用文字を使った場合)
実際に標準に存在するのはどれ?
• UTF-1• UTF-4• UTF-7• UTF-9• UTF-15• UTF-64
実際に標準に存在するのはどれ?
• UTF-1• UTF-4• UTF-7• UTF-9• UTF-15• UTF-64
ちょっと UNICODEの話
群、面、区、点• 古い UCS, UCS-4: 31bit– 7bit の群、 8bit の面、 8bit の区、 8bit の点– 32768 * 65536 * 65536 * 65536 =>21億文字分– こんな使わなくね!?
• 今の UCS, Unicode–群は廃止、 4bit の面、 8bit の区、 8bit の点– 16 * 65536 * 65536 => 111 万文字分
面• 0面
– BMP (Basic Multilingual Plane)– 基本多言語面
• 1面– SMP (Supplementary Multilingual Plane)– 追加多言語面
• 2面– SIP (Supplimentary Ideographic Plane)– 追加漢字面
• 3面– 古代文字の予定
• 4-13 面– 用途未定
• 14面– SSP (Supplimentary Special-purpose Plane)– 追加特殊用途面
• 15-16面– 私用面
BOM (Byte Order Mark)
• UTF-8– 0xEF 0xBB 0xBF–意味ない
• UTF-16– 0xFE 0xFF (big endian)– 0xFF 0xFE (little endian)
• UTF-32– 0x00 0x00 0xFE 0xFF (big endian)– 0xFF 0xFE 0x00 0x00 (little endian)
サロゲートペア• UTF-16 で BMP 以外を表現するときに必要• Java で char は 2byte– 1 文字は char1 つで表現できない!– char String#charAt(int index)– int String#codePointAt(int index)
IVS (Ideographic Variation Sequence)
• と を表示し分けたい– 葛飾区と葛城市の市民が納得しない
• 3 つの方法– フォントを変える– 別のコードポイントを割り当てる– IVS
• ベース文字 + 異体字セレクタ• IVD– Adobe-Japan1– Hanyo-Denshi
終わりに
まとめ• 自分が扱っている文字列が、どのようなバイト列に
なっているか、たまには意識しよう– デバッグ時に役立ちます
• 実務で生かそう– 文字化けした!チェックポイントは?
• 文字符号化方式の解釈が異なっている?• 文字集合に存在しない?• コードポイントが間違っている?• フォントに文字が入っていない?
– Java で 1 文字を char で表現できると思わないでね• 今や常用漢字も表現できない• Windows の TCHAR も全く同じ
もっと詳しく知りたい人は
定番超おすすめ
ちょっと誤植多いけどIVS がよく分かる
読み物標準化の裏側