
読書記録
読者プロフィール
文字コードはShift_JISとUTF-8くらいしか知らない。全部UTF-8でいいんじゃない?くらいの雑な理解。¥マークと\の表記違いは認識していたがShift_JISはASCII互換があると思ってた。本書を読んで誤解だったと知った。
雑感
本書は複数の技術系の書籍の参考文献に載っていて、「文字コードについてこれを読めばOK」と書かれていて気になっていた本。
文字そのものの難しさ、各国の歴史、ネットワークの発展などが絡み合い、一見すると単純にも思える文字の扱いが難解なものになっていることがよくわかる。日本語をベースに話が進むが、256文字以上を持つ言語ではどこも同じような話がありそうなので日本語に特化した話ではない。アジア圏の文字の複雑さがある一方で、アメリカさんのASCIIはシンプルすぎて不思議・・・。
アイヌ文化が文字を持たないことや、閉音節、変体仮名といった恥ずかしながら今まで知らなかった日本語について知ることもできた。文字コードに対して確かな理解が得られる良書と思う。
あらすじ
代表的な符号化文字集合
符号化文字集合とは、文字集合ひとつひとつに一意な値を割り振ったものを指す。
ASCII派生(1バイト文字集合)
最もシンプルな文字集合。ASCIIをベースに各国にローカライズされたものが多数発生している。日本版(JIS X 0201)は片仮名を含んでいる。
符号化文字集合 | サイズ | メモ |
---|---|---|
ASCII (ISO/IEC 646) | 7bit | 0x5Cは(バックスラッシュ) |
ISO/IEC 8859-1(Latin-1) | 1byte | ACCII互換あり。0x80~0xFFに西欧言語を収録 |
JIS X 0201 | 1byte | ASCII互換ありだが、0x5Cは¥ |
日本語文字集合
日本語に特化した文字集合。多数の漢字を収録している。
符号化文字集合 | サイズ | メモ |
---|---|---|
JIS X 0208 | 2byte | 全て2byteなのでaや2といった文字も2byte |
JIS X 0212 | 2byte | JIS X 0208を前提とし、捕捉するもの |
JIS X 0213 | 2byte | JIS X 0208の上位互換 |
国際符号化文字集合
世界中の文字を含める。文字空間が広大すぎて古代文字なども収録されているらしい。
符号化文字集合 | サイズ | メモ |
---|---|---|
Unicode | 4byte |
代表的な符号化方式
符号化方式とは符号化文字集合を実際にデータとして実現する方法を指す。本書では数多くの符号化方式が紹介されているが、個人的にはあまり見かけないものもあると感じた。主観で重要だと思う符号化方式についてまとめる。
Shift_JIS
JIS X 0201とJIS X 0208を用いる符号化方式。
1バイト部分としてはJIS X 0201をそのまま利用する。そのため大部分はASCIIと一致するが、¥記号など一部固有となる。
2バイト文字の1バイト目にJIS X 0201の文字を置いてしまうと1バイトか2バイトであるかの区別がつかないため、1バイト目としてはJIS X 0201で使用していない、0x81~0x9Fと0xE0~0xEFが使用できる。ASCIIやJIS X 0201と互換する符号化方式はASCII範囲の文字が二重に存在することになるが、そのような文字はASCII側で扱う約束とのこと。
EUC-JP(Extended Unix Code)
ASCIIとJIS X 0208を用いる符号化方式。
1バイト部分としてはASCIIを利用する。(0x7F以下)
それ以外は0xA1~0xFE(ASCIIを含まない領域)の2バイトで1文字を表現する。符号化文字集合としては基本的にJIS X 0208を用いる。
特殊な制御文字(シングルシフト)を用いることで、直後の文字にJIS X 0212などを使うことができる。
UTF-8
Unicodeの符号化方式。
ASCII互換がある。
ASCII以外の文字に関しては2~4バイトで符号化する。
UTF-16
Unicodeの符号化方式。
ASCII互換は無い。(Aの符号は0x0041と2バイトになるため)
基本多言語面(BMP)と呼ばれる多様な言語の基本表現に関する文字が含まれる2バイトのセットに関しては、そのままその値を符号とする。つまりBMPの文字はそのまま符号化される。
BMP以外の文字に関しては2つの符号(2バイトが2つ)を用いて表す。分割された領域は上位サロゲート、下位サロゲートと呼ばれる。分割して配置し、1文字を表す仕組みをサロゲートペアと呼ぶ。
理解し辛かったところメモ
7bit符号化
あまり理解できずに読み進めていたこともあって最初意味が分からなかった。
ある漢字(2バイトの番号で表現)を7bitで符号化するとき、元の番号が0x0000~0xFFFFまですべて使う場合は7bit符号化すると3バイトで表現できる。
例えば0xFFFFであれば 0b0-------という型に当て込んでしまうことで0x7F,0x7F,0x03 と7bit×3バイトで表現できる。
元の番号の幅が狭ければ7bit符号化後も2バイトで表現できる。理解してしまえば何も難しい話ではなくただそれだけの話だった。
GL,GR
GL,GRという表現があるが、これは単純に1バイトのうち
GL 0x00~0x7F
GR 0x80~0xFF
というだけのもの。ASCIIやASCII派生の符号化方式で現れる考え方。UTF-16など1バイト文字の登場しない符号化方式では現れない。
GRに呼び出す/固定する
この場合GL(0x00~0x7F)はASCII(派生含む)用に予約されていることが多いはず。
- GRに呼び出すとは、
特殊文字(シフトやエスケープ)によってGR(0x80~0xFF)の使い方を変える。エスケープ後の1文字をドイツ版で符号化したりフランス版で符号化したりさせることを指す。 - GRに呼び出した状態で固定
ASCII以外の文字は1バイト毎は0x80以上とし、複数バイトで符号化する、という意味。
GLに固定(GR不使用)
0x00~0x7Fの範囲の符号のみ使うということ。
7bit符号化で用いる。なお7bit符号化とは1文字を7bit×n(通常はn=2)で表現することを指す。