2022年の9月に読んだ本の記事が、下書きとして残っていたままだったので公開します。


業務で文字コードに触れる機会があったのですがそもそも文字コードというものに詳しくないので「改定新版 プログラマのための文字コード技術入門」という本を読みました。

本を読む前は文字コードにはいくつかの規格があることを知っている程度の理解であったので、なによりもまず勉強になりました。また後述するいくつかの概念は背景とともに説明があって知っておかないと規格を理解しづらいので、本を買ってよかったという気持ちになりました。

それだけでなく、この本を結構読むのが楽しく、平日の数日間で勢いで読み切ってしまうほどでした。

学べたこと: 文字の単位

私達が普段扱う文字は、何がひとつなのか、どれを同じ文字として扱うのか等の境界が実はあいまいで奥深いことを認識しました。 たとえばbyte(8bit)単位で考えると、「あ」は2byteにも3byteにもなり得ます。UTF-16では多くの文字は4byteで表され、処理系においてもそう扱われることがありますが、「𠮟」はサロゲートペアなので8byteで1つの文字を表します。濁点のついた文字は「が」はそれ自体に符号位置が与えられている場合もありますし、「か」と「゛」を分けて符号化したものの結合文字として表現されることもあります。「𠮟」「叱」は十分に似ていそうですが、同じ文字でしょうか?「😀」は文字といえるでしょうか? 普段当たり前にキーボードで入力している文字ですが、それらは符号化文字集合によって符号位置が定まっているだけでなく、複数の文字を一つの文字のように表す結合文字や、文字の単位としての書記素、どのような字形変化であれば同じ文字とみなすかを定めた漢字の包摂規則など、様々な概念に基づく定義の上に成り立っていることを認識しました。

学べたこと: ISO/IEC 2022の概念

1バイトや2バイトのメジャーな符号化方式のいくつかが従うISO/IEC 2022の符号化文字集合の符号位置と符号化方式のコードポイントの対応付の概念を学びました。

G0-G3のバッファに符号面を呼び出した後、GLやGRにそれを呼び出し、呼び出し方を変えたり変えなかったりしながら文字列を表現するということを知りました。

そのほかに学べたこと

  • 文字コードや符号化文字集合における「文字」はどう認識されているのか (byte,正規化、書記素、結合文字などの概念、包摂規則)
  • 文字コードのメジャーな規格とその変遷、文字コード間の関係
  • ISO/IEC 2022の基本概念1バイト/2バイトの符号化方式で基本となるGL,GR,G0からG3のバッファ
  • 区点番号の概念
  • BMPとサロゲートペア、utf-8のバイト数(3,4,6)、BOM

学べなかったこと

外字/機種依存文字の詳細

おわりに

というわけで、ここまでが下書きとして文章で書き出していた内容でした。

2024年にはとりあえずutf8mb4に相当するようなものを使っておけば意識することのない文字コードですが、本を一冊読むとインデックスが生えて、必要な時の引き出しが増えるので便利です。

本当は学んだことをあとから振り返りやすいようにもっと詳細に書きたくて箇条書きや単語レベルのメモを書いていたようですが、書ききっていなかったので以降はまた文字コードに思いを馳せるときがきた時のために、自分向けのメモとして残しておきます。

そのほかのメモ

符号化文字集合

JIS X 208

  • 1978年に制定され、その後複数回改定された日本で最も基本的な2バイト符号化文字集合
  • JIS第1水準、第2水準の漢字が含まれる
  • ISO/IEC 2022準拠。第一バイト(行)第二バイト(列)ともに0x21-0x7Eの94行x94列に収まる組み合わせ
  • 区点番号 ... 94行x94列の表のどこに位置するかを表す表記。例えば愛は16行目六列目に位置するので16区6点という。
  • 対応する符号化方式としてShift_JISやEUC-JP、ISO-2022-JPなどがある

JIS X 212

  • JISX 208と組み合わせて使うことを前提とした2バイト符号化文字集合
  • 94x94
  • EUC-JPでは使う方法が提供されているがShift_JISでは使えない

JIS X 213

  • JIS X 208を拡張した2バイト符号化文字集合
  • 2000年に制定され2004年に改定されたため、JIS2000、JIS2004などと呼ばれることがある
  • JIS X 212とはかなりの文字が重複する
  • 94x94を2面持つ
  • 1面はJIS X 208の空き領域に文字を追加したもの(追加された漢字はJIS第3水準)
  • 2面は漢字のみ (JIS第4水準)
    • JIS X 212で定義されている区点番号を避けている
    • EUC-JPのJIS X 212と区別がつくように
  • 符号化方式としてはShift_JIS-2004、ISO-2022-JP、EUC-JIS-2004

Latin-1 (ISO/IEC 8859-1)

MySQL5系のデフォルトで設定されることでおなじみ 8ビット1バイトの符号化文字集合で、西ヨーロッパ言語向けの文字をふくむ GLにASCIIを固定し、GRにLatin-1で定義した文字が使われる

そのほか書きたかったこと

  • JIS X 208 212 213 eucJP-ms IBM拡張
  • Unicode ISO/IEC 10646(UCS) JIS X 0221
  • BMP
  • 正規化
  • 書記素
  • IBM拡張
  • NEC拡張
  • NEC選定IBM拡張
  • EUC-JP(GLはASCIIで固定)
  • eucJP-ms
  • Shift_JIS EUC-JP JISX 208の関係
  • 各言語処理系での実装
  • Rubyの実装(CP51932, EUC_JP, EUCJP_MS)
  • PHPの実装
  • Goの実装