@banyan's blog

「プログラマのための文字コード技術入門」を読んだ

もう2年前に出版された本だけどずっと気になってたので買って読んでみた。すばらしく良書でかつ面白かった。文字コードの大きな流れが見えて理解しやすかった。

長年ちゃんと理解してなかったことが書いてあったりすると喜びは格別なのだけど、 もっと早く知っておけばよかったとも、やきもきしながら読んでた。

全部理解できてるわけではないし、そして正直読んだ端から頭から抜けていくので以下気になったところの一部をメモしておく。

第1章 文字とコンピュータ

  • 事物を符号で表現することを「符号化」と呼ぶ
  • 文字とそれに対応するビット組み合わせを対応付ける規則を「文字コード」と呼ぶ
  • 文字コードを初期に設計した人は世界中の文字を符号化することは考えずに自国の自分たちの用に足るだけの文字を扱うことを考えた
  • 文字を重複なく集めたものを「文字集合」と呼ぶ
    • ラテンアルファベットの大文字・小文字
    • 常用漢字の1945文字
  • 文字コードを決める際には、文字集合を定めることが必須
  • 文字集合を定義し、その集合の各文字に対応するビット組み合わせを「文字コード」もしくは「符号化文字集合」(coded character set) と呼ぶ
    • 実用的な符号化文字集合の例 - ISO/IEC 646 国際基準 (ASCII と同様)
  • 文字表の中の位置のことを「符号位置」(code position) と呼ぶ
  • 文字は一意に符号化されることが文字コードの原則
  • 文字コードが複雑になる2つの理由
    • 過去の資産との互換性や連続性を考慮する必要がある
    • 文字そのものの難しさ

第2章 文字コードの変遷

  • 最も基本的な文字コード
    • 1960 年代にアメリカの規格として開発された ASCII (American Standard Code for Information Interchange)
    • 7ビットの1バイトコード
    • 全部で128の符号位置
    • 0x00 から 0x1F までの位置は制御文字に割り当てる
    • ASCII はアメリカで開発されたので通貨記号として$ (ドル記号) を含む
  • ASCII の各国用の変種
    • 各国語版の ISO/IEC 646 が作られることになる
    • 日本版の ISO/IEC 646 -> 日本工業規格の JIS X 0201 として標準化
    • 符号位置 0x5C: ASCII では \ (バックスラッシュ) なのが ¥ (通貨の円記号に)
    • 符号位置 0x7E: ASCII では ~ (チルダ) なのが、¯ (オーバーライン)に
    • ISO/IEC 646 には国際基準版 (International Reference Version) というどこの国でもないバージョンができたが、現在では ASCII と同じものになっている
    • ISO/IEC 646 の問題 -> 複数の言語を混在化させることができなかった
  • 文字コードを拡張するための枠組みとして ISO/IEC 2022 が登場
    • 8ビットコード (第8ビットも用いる文字コード) や2バイトコード (2つのバイトで1文字を表す文字コード) が可能
    • 複数の符号化文字集合を組み合わせて用いることができるように
    • CL/GL, CR/GR
    • 文字集合の切り替えのためにエスケープシーケンスを利用する
    • ISO/IEC 2022 = エスケープシーケンスではない。(EUC-JP はエスケープシーケンスを使ってない)
  • ISO/IEC 2022 に則った2バイト符号化文字集合 -> 1978年に制定された日本の JIS X 0208
    • 94 * 94 = 8836 の符号位置がある
    • ちなみに常用漢字が 1945 文字
    • 漢字だけでなく、平仮名、片仮名、ラテン文字、ギリシャ文字、キリル文字など様々な文字を含む
    • 1バイトコードに2バイトコードを組み合わせたい
    • JIS X 0208 を ASCII や JIS X 0201 といった1バイトコードと組み合わせて運用する方法が普及 -> Shift_JIS や EUC-JP、ISO-2022-JP はそうした符号化方式
  • ヨーロッパでは8ビットの1バイトコードが広く使用され代表格が ISO/IEC 8859-1。通称 Latin-1
  • 国際符号化文字集合
    • 世界中の文字をひとつの表に収める
    • ISO/IEC 10646 と Unicode の誕生
    • ISO/IEC 10646 と Unicode は別個の規格でありながら、どちらかに文字が追加されればまた一方にも追加され、互いに同一の文字表として改訂されている

第3章 代表的な符号化文字集合

  • ASCII と ISO/IEC 646
    • 最も基本的な1バイト文字集合
  • JIS X 0201
    • ラテン文字と片仮名の1バイト文字集合
  • JIS X 0208
    • 日本の最も基本的な2バイト文字集合
    • 97 JIS 包摂基準。この概念はとても重要。
  • JIS X 0212
    • 補助漢字。あまり使われてない。
  • JIS X 0213
    • 第3、第4水準漢字への拡張
    • アイヌ語表記用片仮名
    • 賈詡 (かく)、荀彧 (じゅんいく)、龐統 (ほうとう)、許褚 (きょちょ) といった三国志の登場人物は第3、第4水準漢字
  • ISO/IEC 8859 シリーズ
    • 欧米で広く使われる1バイト符号化文字集合
  • Unicode と ISO/IEC 10646
    • 国際符号化文字集合
    • Universal Multiple Octet Coded Character Set (UCS) = ISO/IEC 10646 = Unicode
    • 基本多言語面 (BMP)
    • Unicode は整数値で表される符号位置と文字とを対応付ける
    • その整数である符号位置をバイト列の形で表現するための方式として UTF-8 や UTF-16, UTF-32 といった各種の符号化方式が定められている

第4章 代表的な文字符号化方式

  • 後で書く

第5章 文字コードの変換と判別

  • 後で書(ry

第6章 インターネットと文字コード

  • 後で(ry

第7章 プログラミング言語と文字コード

  • Java, Ruby1.8, Ruby1.9 の文字コードの取り扱いを紹介。

第8章 はまりやすい落とし穴とその対処

  • 後(ry

Appendix

  • 北朝鮮で1990年代に作られた文字コード KPS 9566 では、「金日成」「金正日」という人名表記に相当するハングル6文字がこの順番に通常のハングルと独立した区点位置にあって、人名でソートした際必ず最初に現れるらしい。面白い。