■プログラマのための文字コード技術入門

〜ちょっと内容は難しいけどオススメ〜

プログラマのための文字コード技術入門 (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、日本の文字コード規格、文字化けのメカニズム、コード変換の基礎、
 JavaRuby 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-JPShift_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 国際符号化文字集合の模索と成立 ――UnicodeISO/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
★√(根号)、∫(積分)、集合記号
森鴎外、歐、殴、駆、驅、鶯、煕など(WindowsIME使用時には「環境依存文字」と出るもの)
★包摂規準:字体差の許容範囲…しんにょう、食偏、…飮、?、燗、?など多数
機種依存文字文字コードの空き領域に独自に割り当てた文字「環境依存文字」
 丸付数字、ローマ数字、訒小平、草磲、携帯絵文字…これらが旧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
MacOSXSafari、、、WinVista、7(Unicode互換として実装)

★3.6 ISO/IEC 8859シリーズ ――欧米で広く使われる1バイト符号化文字集合
・英仏独伊 他多数(約25)
・NBSP(ノーブレークスペース:改行を禁じるスペース)
・SHY(ソフトハイフン:改行時にはハイフンが入る)
・パート1〜7(ギリシャ)〜11(タイ)〜16、

 3.7 UnicodeISO/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_JisISO-2022-JPUTF-8,16,32)
 4.1 JIS X 0201の符号化方式
・7Bitインターネット電子メール、制御文字で切換(GLのみ)

 4.2 JIS X 0208の符号化方式
・8種(UC-JP、Shift_JisISO-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からiPhoneiPod touchMacに送ってはいけない文字とは?
 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-8Base64使用(JIS X 0213)

 6.2 Webと文字コード
・HTML4.01準拠、著作権:©(©)、<>&"なども同様
文字コードの指定「charset=」
 
 
 
★別途:HTMLの観点からのDOCTYPE、LANG(UTFならなおさら)指定も必要
CSSの符号化 文法内に @charset"***" がある
・URL符号化(URLエンコーディング:%の後に2桁16進)…主にプログラム、ログ
・HTTPでの問題点
 1.復号するファイルの中に必要な文字コードが宣言されている(空ける箱の中に鍵がある)
 2.コード変換する場合、メタタグの修正も必要
★サーバ側で文字コードを指定している場合もある、「Apachehttpd.conf」、「IIS、応答ヘッダ」
 http://tech.bayashi.net/pdmemo/chara2.html
・GCI(Perl)の場合、HTML(フォーム側)とプログラム側の文字コードが一致している必要がある
 UNIX(Linux)…EUCWindowsSjis、世界的には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)UnixLinux

□第7章 プログラミング言語文字コード
★7.1 Java ――内部処理をUnicodeで行う
 http://ja.wikipedia.org/wiki/Java
・参考:PerlUnixEUC、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
SjisUnicodeSjisで化ける(最終の読み合わせが必要)

■(重要)第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
SjisUnicodeSjis などで「〜~」が「?」などに置き換わる
チルダとは、アルファベット上に置くダイアクリティカルマーク(ウムラウト、アクサンの仲間:スペイン、ポルトガル語)
・対策(×)1.Unicodeに変換しない、2.コード変換を揃える★3.Unicode間のみで変換する(UnicodeUnicodeSjisSjis)
 例)\ ~  ̄ \ 〜 ‖¥ ¢ £ ¬
 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 EmacsSKKによる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