文字コード入門 理論編 クイズ付き

35
文文文文文文文 文文文 2013/07/30 baba@BPS 文文文文文

Upload: takao-baba

Post on 12-Dec-2014

1.178 views

Category:

Technology


4 download

DESCRIPTION

社内勉強会「文字コード入門」で使った資料です。 文字集合(Character Set)と文字エンコーディング(Character Encoding Scheme)の関係、よく使う文字エンコーディングの特徴などを取り上げました。

TRANSCRIPT

Page 1: 文字コード入門 理論編 クイズ付き

文字コード入門理論編

2013/07/30baba@BPS

クイズ付き

Page 2: 文字コード入門 理論編 クイズ付き

本資料について• 本資料は、社内勉強会で使った資料です– 外部向けに書かれていない記述がある可能性

があります– 正確な解説を省いている箇所があります

• 本資料の取り扱いについて– 再配布等のご相談は [email protected] までお願

いします。

Page 3: 文字コード入門 理論編 クイズ付き

はじめに• 今回は文字コードの用語解説と基礎知識の話

です• 話さないこと– Ruby や Java や C でどのように書けば良いか、と

いった実装の話– 文字コード変換、文字化けに関する話– フォントに関する話– Unicode の細かい話– バイナリな話

• 後半にクイズがあります

Page 4: 文字コード入門 理論編 クイズ付き

目次• 文字集合と文字エンコーディング– 文字集合– 符号化文字集合– 文字符号化形式

• クイズ• ちょっと Unicode の話

Page 5: 文字コード入門 理論編 クイズ付き

文字集合と文字エンコーディング用語を理解しよう

Page 6: 文字コード入門 理論編 クイズ付き

文字集合と文字エンコーディング

• 文字集合– Character Set

• 符号化文字集合– Coded Character Set

• 文字符号化方式– Character Encoding Scheme

• 符号点– Code Point

”※ charset” は文字集合ではない

Page 7: 文字コード入門 理論編 クイズ付き

文字集合と文字エンコーディング

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

Page 8: 文字コード入門 理論編 クイズ付き

文字集合• 数字– 0-9 の 10 文字

• ラテン文字– A-Z 大文字小文字の 52 文字

• ひらがな、カタカナ• ギリシア文字• 記号• 漢字

Page 9: 文字コード入門 理論編 クイズ付き

JIS の文字集合• 非漢字

– 数字、ラテン文字、記号など 約 500 文字• 第一水準

– 常用漢字のほぼすべて、人名用漢字、その他日常的に使う漢字 約 3,000 文字

• 第二水準– 動植物名漢字など 約 3,300 文字

• 第三水準– あまり使わない漢字 約 1,200 文字– でも常用漢字が含まれている

• 第四水準– あまり使わない漢字 約 2,400 文字

Page 10: 文字コード入門 理論編 クイズ付き

符号化文字集合• 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• 情報漢字表改定に伴うマイナーチェンジ

Page 11: 文字コード入門 理論編 クイズ付き

符号化文字集合• UCS-2– Unicode 0 面• BMP (Basic Multilingual Plane)

– U+0 ~ U+FFFF• 65536 文字分

• UCS-4– Unicode で扱うすべて– U+0 ~ U+10FFFF• 約 111 万文字分

Page 12: 文字コード入門 理論編 クイズ付き

符号化文字集合

ラテン文字

第一水準漢字

第三水準漢字第二水準漢字

第四水準漢字

数字

記号

ひらがな / カタカナ

ISO 646

UCS2

JIS X 0208JIS X 0213

ハングル

ギリシア文字

キリル文字

ヘブライ文字

ルーン文字

モンゴル文字

顔文字

古代文字

麻雀牌

錬金術記号

UCS4

JIS X 0212

Page 13: 文字コード入門 理論編 クイズ付き

文字符号化方式• 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 でエスケープシーケンスを使って日本語を表現– ステートフルなエンコーディング– 日本語メールでよく使われる

Page 14: 文字コード入門 理論編 クイズ付き

文字符号化方式• UTF-8– Web でよく使われる

• UTF-16– UCS-2 と BMP 内で対応– Java, Windows, Python などの内部文字コード

• UTF-32– UCS-4 と対応– ユーザレベルではあまり使わない

Page 15: 文字コード入門 理論編 クイズ付き

クイズ

Page 16: 文字コード入門 理論編 クイズ付き

この文字エンコーディングは?• Amazon で日本語商品を表示した

• どれでしょう– Shift_JIS– UTF-8– UTF-16– Unicode Code Point

• 標準仕様? Web サイト依存?ブラウザ依存?

Page 17: 文字コード入門 理論編 クイズ付き

7bit 文字エンコーディングはどれ?

• ISO646 (ASCII)• Shift_JIS• EUC-JP• ISO-8859-1• ISO-2022-JP• UTF-8• UTF-16• UTF-32

Page 18: 文字コード入門 理論編 クイズ付き

7bit 文字エンコーディングはどれ?

• ISO646 (ASCII)• Shift_JIS• EUC-JP• ISO-8859-1• ISO-2022-JP• UTF-8• UTF-16• UTF-32

Page 19: 文字コード入門 理論編 クイズ付き

ASCII 互換エンコーディングはどれ?

• Shift_JIS• EUC-JP• ISO 8859-1• ISO-2022-JP• UTF-8• UTF-16• UTF-32

Page 20: 文字コード入門 理論編 クイズ付き

ASCII 互換エンコーディングはどれ?

• Shift_JIS• EUC-JP• ISO 8859-1• ISO-2022-JP• UTF-8• UTF-16• UTF-32

Page 21: 文字コード入門 理論編 クイズ付き

バイト数から文字数を求められるのは?

• ISO646 (ASCII)• Shift_JIS• EUC-JP• ISO 8859-1• ISO-2022-JP• UTF-8• UTF-16• UTF-32

※ 改行や BOM 、制御文字などは気にしない

Page 22: 文字コード入門 理論編 クイズ付き

バイト数から文字数を求められるのは?

• ISO646 (ASCII)• Shift_JIS• EUC-JP• ISO 8859-1• ISO-2022-JP• UTF-8• UTF-16• UTF-32 (コードポイント数は求められる)

Page 23: 文字コード入門 理論編 クイズ付き

UTF-8 で 1 文字の最大バイト数は?

• 1 バイト• 2 バイト• 3 バイト• 4 バイト• 5 バイト• 6 バイト• 7 バイト• 8 バイト• 9 バイト• それ以上

Page 24: 文字コード入門 理論編 クイズ付き

UTF-8 で 1 文字の最大バイト数は?

• 1 バイト• 2 バイト• 3 バイト• 4 バイト ( Unicode 文字が割り当てられる範囲)• 5 バイト• 6 バイト (旧 UTF-8 の規格上)• 7 バイト• 8 バイト (実用上の最大バイト数)• 9 バイト• それ以上 (合成用文字を使った場合)

Page 25: 文字コード入門 理論編 クイズ付き

実際に標準に存在するのはどれ?

• UTF-1• UTF-4• UTF-7• UTF-9• UTF-15• UTF-64

Page 26: 文字コード入門 理論編 クイズ付き

実際に標準に存在するのはどれ?

• UTF-1• UTF-4• UTF-7• UTF-9• UTF-15• UTF-64

Page 27: 文字コード入門 理論編 クイズ付き

ちょっと UNICODEの話

Page 28: 文字コード入門 理論編 クイズ付き

群、面、区、点• 古い UCS, UCS-4: 31bit– 7bit の群、 8bit の面、 8bit の区、 8bit の点– 32768 * 65536 * 65536 * 65536 =>21億文字分– こんな使わなくね!?

• 今の UCS, Unicode–群は廃止、 4bit の面、 8bit の区、 8bit の点– 16 * 65536 * 65536 => 111 万文字分

Page 29: 文字コード入門 理論編 クイズ付き

面• 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面– 私用面

Page 30: 文字コード入門 理論編 クイズ付き

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)

Page 31: 文字コード入門 理論編 クイズ付き

サロゲートペア• UTF-16 で BMP 以外を表現するときに必要• Java で char は 2byte– 1 文字は char1 つで表現できない!– char String#charAt(int index)– int String#codePointAt(int index)

Page 32: 文字コード入門 理論編 クイズ付き

IVS (Ideographic Variation Sequence)

•   と  を表示し分けたい– 葛飾区と葛城市の市民が納得しない

• 3 つの方法– フォントを変える– 別のコードポイントを割り当てる– IVS

• ベース文字 + 異体字セレクタ• IVD– Adobe-Japan1– Hanyo-Denshi

Page 33: 文字コード入門 理論編 クイズ付き

終わりに

Page 34: 文字コード入門 理論編 クイズ付き

まとめ• 自分が扱っている文字列が、どのようなバイト列に

なっているか、たまには意識しよう– デバッグ時に役立ちます

• 実務で生かそう– 文字化けした!チェックポイントは?

• 文字符号化方式の解釈が異なっている?• 文字集合に存在しない?• コードポイントが間違っている?• フォントに文字が入っていない?

– Java で 1 文字を char で表現できると思わないでね• 今や常用漢字も表現できない• Windows の TCHAR も全く同じ

Page 35: 文字コード入門 理論編 クイズ付き

もっと詳しく知りたい人は

定番超おすすめ

ちょっと誤植多いけどIVS がよく分かる

読み物標準化の裏側