■プログラマのための文字コード技術入門
〜ちょっと内容は難しいけどオススメ〜
■プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ) [単行本(ソフトカバー)]
http://www.amazon.co.jp/gp/product/toc/477414164X/
矢野 啓介 (著)
http://yanok.net/
■内容紹介
より深く知り、すぐ試し、上手に実装したい。
プロの道を進む方々にお届けしたい「ベーシック」、
WEB+DB PRESS plusシリーズ「技術入門」の第1弾です。
コンピュータにおいてテキストデータを扱う上で欠かせない文字コード。
文字と符号(ビット組み合わせ)で形作られる文字コードの基本的な性質はシンプルです。
しかし、文字コード、とりわけ日本語情報処理となると、数々の落とし穴が潜む、ときに専門的な知識が求められる、
そのような難易度の高いイメージが漂うのはなぜでしょうか。その背景を探ると、文字コードとは切っても切り離せない
「文字という存在、そのものの難しさ」「規格を含む過去の経緯の積み重ね」の影響が浮かび上がってきます。
本書では、文字そのものと、文字コードの歴史を少しずつ解きほぐしながら、
文字コードの原則、変遷、おもな規格の要点をはじめとした基礎知識を丁寧に解説。
さらに、Unicode、日本の文字コード規格、文字化けのメカニズム、コード変換の基礎、
Java、Ruby 1.8/1.9での扱い、はまりやすい落とし穴とその対処など、広くソフトウェアエンジニアの方々、
プログラマの方々へ、今知っておきたい技術情報を厳選してお届けします。
■目次
■第1章 文字とコンピュータ
1.1 コンピュータで文字を扱う基本
・文字コードとフォント
1.2 文字を符号化するということ
1.3 文字「集合」と「符号化」文字集合
★文字コード=(集合・フォント+エンコード)
・文字化け:異なる文字コード符号化データの解釈違い
・内部コード(Unicodeが多)、外部コード
1.4 制御文字 ――文字ではない文字
・BEL/HT・VT/CR・LF/ESC/SP/DEL
1.5 文字コードはなぜ複雑になるのか
・過去の経緯、字体差、合成文字など(文字そのものの難しさ)
1.6 まとめ
★符号化文字集合、符号化と一意性、過去の経緯、文字の難しさ
■第2章 文字コードの変遷
2.1 最もシンプルな文字コード ――ASCII(7bit)、ISO/IEC 646(JIS X 0201)
★ASCII:\バックスラッシュ−¥記号
http://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%82%AF%E3%82%B9%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5
★ASCII:~(チルダ)−オーバーライン との違い
http://ja.wikipedia.org/wiki/%E3%83%81%E3%83%AB%E3%83%80
http://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%A9%E3%82%A4%E3%83%B3
2.2 文字コードの構造と拡張方法を定める ――★ISO/IEC 2022(8Bit、2バイト)★
・CLGL/CRGR…C:Control制御、G:Graphic図形…2バイト文字
2.3 2バイト符号化文字集合の実用化 ――JIS X 0208、★各種符号化方式
・6879文字の漢字、常用漢字1945文字含
・平仮名、片仮名、ラテン、ギリシャ、キリル、算用数字、記号
★各種符号化方式:ASCII・JISX0201+JISX0208と組み合わせる(EUC-JP、ISO-2022-JP、Shift_Jis)
・中国:簡体字、韓国:ハングル+漢字、台湾:繁体字(はんたいじ)
http://ja.wikipedia.org/wiki/%E7%B9%81%E4%BD%93%E5%AD%97
2.4 1バイト符号化文字集合の広がり ――ISO/IEC 8859、Latin-1(欧州、西ヨーロッパ)
2.5 国際符号化文字集合の模索と成立 ――Unicode、ISO/IEC 10646(←Unicode:10万字)
・UTF-16:未使用領域の16Bitを2つまとめる
★UTF-8 :ASCIIとバイト単位で互換になるよう計算で変形
・OS内部コードや、WebでのUnicode化は進んでいる、地域コードとの併用(中国:GB18030、香港:HKSCS)
2.6 まとめ
★ルーツ7BitASCII、符号化方式(EUC-JP、Shift_Jis)、欧州1バイトコード:ISO/IEC8859-1
Unicodeの地域コードとの併存
■第3章 代表的な符号化文字集合
3.1 ASCII(米)とISO(国際規格)/IEC 646 ――最も基本的な1バイト文字集合
・独:DIN66003(ISO/IEC 646のドイツ版)…エスツェット、ウムラウト
http://ja.wikipedia.org/wiki/%C3%9F
http://ja.wikipedia.org/wiki/%E3%82%A6%E3%83%A0%E3%83%A9%E3%82%A6%E3%83%88
3.2 JIS X 0201 ――ラテン文字と片仮名の1バイト文字集合
・濁点、半濁音が1文字+α
★ASCII:\バックスラッシュ−¥記号
ASCII:~(チルダ)−オーバーライン との違いの為コード変換が特殊になる
3.3 JIS X 0208 ――日本の最も基本的な2バイト文字集合
・6879文字、1978-1983-1990-1997で改訂
★仝(同上)、々(繰返し)、〆(しめ)、〇(漢数字ゼロ)、σ(シグマ)、(ファイナルシグマ)
http://ja.wikipedia.org/wiki/%CE%A3
★ダイアクリティカルマーク(アルファベットに付く、アクセント、ウムラウト、チルダ類)、Å(オングストローム)
・片仮名:ヴ、ヶ、漢字:第1水準(読み順)、第2水準(部首、画数順)…各3000字
http://www.shuiren.org/chuden/teach/code/main4.htm
★√(根号)、∫(積分)、集合記号
★森鴎外、歐、殴、駆、驅、鶯、煕など(Windows:IME使用時には「環境依存文字」と出るもの)
★包摂規準:字体差の許容範囲…しんにょう、食偏、…飮、?、燗、?など多数
★機種依存文字:文字コードの空き領域に独自に割り当てた文字「環境依存文字」
丸付数字、ローマ数字、訒小平、草磲、携帯絵文字…これらが旧MacOSとの間で文字化けする
3.4 JIS X 0212 ――補助漢字(★Shift_Jis非互換?)
★非漢字としてダイアクリティカルマーク付きラテン文字、ギリシャ文字、キリル文字
著作権、逆感嘆符、逆疑問符、チルダ、μ など
http://www.asahi-net.or.jp/~ax2s-kmtn/ref/jisx0212/index.html
http://www.asahi-net.or.jp/~ax2s-kmtn/character/japan.html
http://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89
3.5 JIS X 0213 ――漢字第3・第4水準への拡張(11233文字)
・印刷物でよく使用される文字
★ラテン文字・アイヌ語・鼻濁音・ダイアクリティカルマーク
・漢字第3、第4水準
★機種依存文字と互換文字:①②、ⅠⅡ、(月)(火)、㍼、㍻、㌔、㎞ など
http://www.asahi-net.or.jp/~ax2s-kmtn/ref/jisx0213/index.html
★MacOSX、Safari、、、WinVista、7(Unicode互換として実装)
★3.6 ISO/IEC 8859シリーズ ――欧米で広く使われる1バイト符号化文字集合
・英仏独伊 他多数(約25)
・NBSP(ノーブレークスペース:改行を禁じるスペース)
・SHY(ソフトハイフン:改行時にはハイフンが入る)
・パート1〜7(ギリシャ)〜11(タイ)〜16、
3.7 UnicodeとISO/IEC 10646 ――国際符号化文字集合=UCS=Unicode(JIS X 0221含)
http://www.asahi-net.or.jp/~ax2s-kmtn/character/uni.html#unicode
ユニコード(東アジア)…CJK統合漢字
http://www.asahi-net.or.jp/~ax2s-kmtn/ref/unicode/e_asia.html
http://www.asahi-net.or.jp/~ax2s-kmtn/ref/unicode/index.html
・世界中の文字を収めるべく開発
・U+4E00のように「U+」+「4〜6桁16進数」で表現
・結合文字・基底文字
・UTF-8-16-32 は符号化方式
■第4章 代表的な文字符号化方式(EUC-JP、Shift_Jis、ISO-2022-JP、UTF-8,16,32)
4.1 JIS X 0201の符号化方式
・7Bitインターネット電子メール、制御文字で切換(GLのみ)
4.2 JIS X 0208の符号化方式
・8種(UC-JP、Shift_Jis、ISO-2022-JPを含)
★EUC-JP :Unix系OS、ASCII拡張、ISO準拠
★ISO-2022-JP :日本語データのメール利用、(GLのみ)、状態を持つ
http://ja.wikipedia.org/wiki/ISO-2022-JP
★Shift_Jis :JIS X 0208組み合わせを一定の計算式で変換
http://ja.wikipedia.org/wiki/Shift_JIS
:(MS漢字コード、シフト符号化表現)、0x5c「バックスラッシュ」が特殊
:半角英数字、全角カタカナを使用(重複符号)
4.3 Unicodeの符号化方式…ASCII互換
★1〜4,6バイト可変長、漢字や仮名などの表現に3バイト
★http://ja.wikipedia.org/wiki/UTF-8
□第5章 文字コードの変換と判別(nfk、kccなど:難)
5.1 コード変換とは
5.2 変換の実際 ――変換における考え方
5.3 文字コードの自動判別
5.4 まとめ
・文字コードを変換する
http://www.atmarkit.co.jp/fwin2k/win2ktips/395codeconv/codeconv.html
★WindowsからiPhone/iPod touch/Macに送ってはいけない文字とは?
http://www.atmarkit.co.jp/fwin2k/win2ktips/1365chrglb/chrglb.html
http://www.atmarkit.co.jp/fdb/rensai/ora_admin/06/oraadmin06_01.html
■第6章 インターネットと文字コード ★★★
6.1 電子メールと文字コード
★日本語メールは7bitのISO-2022-JP
・ASCIIを多言語に拡張するMIME、添付ファイルなども
・使用する符号化(Quoted-printable)
http://ja.wikipedia.org/wiki/Quoted-printable
タブ、スペースはそのまま変換なしに表されるが、行末に現れた場合だけは符号化「=09」(タブ)、「=20」(スペース)
データは、76文字以内、越える場合は、改行+行末に「=」
★使用する符号化(Base64)…データ全体を変形
エンコード後★約1.33倍(5MB=1.33×3.75MB)に増える、★1行76文字
http://e-words.jp/w/BASE64.html
http://homepage1.nifty.com/glass/tom_neko/web/web_03.html
・charset:文字集合というよりは、エンコード方式、エンコードされた文字のこと
・ヘッダの符号化はB符号化(ASCIIに収める:B?)、Q符号化(ASCII以外を符号化:Q?)
・添付ファイル名の文字化け、RFC2231準拠か?、ISO-2022-JPがNGな場合、UTF-8、Base64使用(JIS X 0213)
6.2 Webと文字コード
・HTML4.01準拠、著作権:©(©)、<>&"なども同様
★文字コードの指定「charset=」
★別途:HTMLの観点からのDOCTYPE、LANG(UTFならなおさら)指定も必要
・CSSの符号化 文法内に @charset"***" がある
・URL符号化(URLエンコーディング:%の後に2桁16進)…主にプログラム、ログ
・HTTPでの問題点
1.復号するファイルの中に必要な文字コードが宣言されている(空ける箱の中に鍵がある)
2.コード変換する場合、メタタグの修正も必要
★サーバ側で文字コードを指定している場合もある、「Apache の httpd.conf」、「IIS、応答ヘッダ」
http://tech.bayashi.net/pdmemo/chara2.html
・GCI(Perl)の場合、HTML(フォーム側)とプログラム側の文字コードが一致している必要がある
UNIX(Linux)…EUC、Windows…Sjis、世界的にはUTF(MacOSX、WinVista以降もUTF)
http://www.atmarkit.co.jp/fwin2k/win2ktips/395codeconv/codeconv.html
★http://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89
★6.3 まとめ
★メールは7Bitの世界、8bitを扱うための「Quoted-printable、Base64」
★ヘッダの符号化はB符号化、Q符号化
★HTML,CSSは文中に文字コード指定、URLエンコード、ヘッダ(サーバ単位)でも指定可能
★フォームとプログラムの文字コードは揃える
★UTF-8のOS(Ubuntu、Fedra、部分Win、MacX)が増えてきている、(EUC)Unix、Linux
□第7章 プログラミング言語と文字コード
★7.1 Java ――内部処理をUnicodeで行う
http://ja.wikipedia.org/wiki/Java
・参考:PerlはUnixでEUC、ActiveServerPageや.NETはShift_Jis
7.2 Ruby 1.8 ――シンプルな日本語化
・ASCIIをベースにSJIS,EUC,UTF-8対応
7.3 Ruby 1.9 ――★CSI方式で多様な文字コードを処理
・まつもとゆきひろ(通称Matz)により開発されたオブジェクト指向スクリプト言語
http://ja.wikipedia.org/wiki/Ruby
7.4 まとめ
★Windows機種依存…ローマ数字、丸数字、記号、難しい漢字「磲」など
http://www.asahi-net.or.jp/~ax2s-kmtn/ref/mdc.html
※Sjis→Unicode→Sjisで化ける(最終の読み合わせが必要)
■(重要)第8章 はまりやすい落とし穴とその対処 ★★★
8.1 トラブル調査の必須工具 ――16進ダンプツール:Unix環境(Cygwin)の「od」コマンド
8.2 文字化け
★「IEツールバー/表示/エンコード」で変更する
ブラウザ上で文字化けすると□、<?>(FireFox)などのようになる
★ラベルの表記間違い:MIME、HTMLで「charset」指定を「SJIS」、「UTF8」のように誤植していないか
★機種依存文字、複数文字コードを通すことで「?」などに化ける(RSS出力、丸数字)
★文字化け防止の原則
文字コードを明示する(charset指定)、機種依存文字を使わない
8.3 改行コード
★CR(改行)LF(冒頭)の混在、nfkのコード変換、UnixTrコマンド(CRのみ取り除く)
MacOSX:LFが標準
http://ja.wikipedia.org/wiki/%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89
8.4 「全角・半角」問題
★検索でヒットしない、全角=2バイト文字
★「全角・半角」印刷用語、「全角アキ」など、文字の印字幅はフォント次第
・Webでは区別しにくい(★秀丸ではわかる)…秀丸エディタ用半角→全角変換マクロ「全閣下」
http://www.vector.co.jp/soft/win95/writing/se310637.html
★Webフォーム入力時は、住所など全角で無いとはじく、電話番号:半角で無いとはじくなど
もしくは、明示的に半角記号数字のものは変換する などの処理が考えられる
8.5 円記号問題(¥バックスラッシュ)
http://www.relief.jp/itnote/archives/001280.php
★チルダ、円記号の問題、異プラットフォームでのデータ移動が少なかった、表示上のちょっとした違い
表記はブラウザの「★lang属性」にも依存する
・また文字化けに伴い「\」がエスケープ文字に置き換わってエラーになる場合もある…★記号表記には「全角」を用いる
・使用するソフトウェアが円記号をそのように扱うのか把握する
8.6 波ダッシュ問題
http://ja.wikipedia.org/wiki/%E6%B3%A2%E3%83%80%E3%83%83%E3%82%B7%E3%83%A5
★Sjis→Unicode→Sjis などで「〜~」が「?」などに置き換わる
・チルダとは、アルファベット上に置くダイアクリティカルマーク(ウムラウト、アクサンの仲間:スペイン、ポルトガル語)
・対策(×)1.Unicodeに変換しない、2.コード変換を揃える★3.Unicode間のみで変換する(Unicode→Unicode、Sjis→Sjis)
例)\ ~  ̄ \ 〜 ‖¥ ¢ £ ¬
http://www.ingrid.org/java/i18n/unicode.html
8.7 まとめ
★16進ダンプ、日本の環境「全角半角」、「円記号」、「波ダッシュ」
★Unicodeへの変換時の問題
■Appendix
A.1 ISO/IEC 2022のもう少しだけ詳しい説明
A.2 JIS X 0213の符号化方式
A.3 諸外国・地域の文字コード概説
・中国:GB2312、GB18030、韓国:KSX1001、北朝鮮:KPS9566
・香港:HKSCS、ロシア:KOI8-R(キリル文字)、台湾:Big5、CNS11643
A.4 Unicodeの諸問題
・正規化:符号化を揃える、互換漢字の扱い
★ファイル交換の際のMac、Winの合成文字の扱いなどで別ファイルとみなされるなど例「ボ」
・国別:日本、台湾の「器」違い
・異体字セレクタ:文字の後に置いて文字の細かな形を指定する特殊文字…IVS
http://ja.wikipedia.org/wiki/IVS
★携帯絵文字のUnicode収録(2009/11途中)、キャリア間での絵文字変換表が必要
A.5 EmacsとSKKによるJIS2004の活用 ――本書執筆の舞台裏
・特殊文字の入力が可能
A.6 規格の入手・閲覧方法ならびに参考文献
以上
■参考
http://raven.air-nifty.com/night/2010/03/it-23d4.html
http://d.hatena.ne.jp/hyoshiok/20100214
http://yanok.net/book/code2010/
http://qune.cside.com/archives/001570.html
http://www.swingingblue.net/mt/archives/002861.html
http://iiyu.asablo.jp/blog/2010/08/21/5299735