プログラマのための文字コード技術入門
https://scrapbox.io/files/66654bdef1049200390bea09.png
ためになる
この本、気を抜いていると前提知識においてかれるので整理
前提概念
文字コード
後述する符号化文字集合、文字符号化方式などのことを指すことが多い曖昧な言葉
符号化文字集合
その集合が定義している文字とコードの対応
ここでの「コード」は実際のバイト列と必ずしも一致するわけではなく、まだ抽象的な存在
文字符号化方式
ある符号化文字集合のコードと、実際のバイト列との対応付け
符号位置, code point, code position
文字コード中のある文字の位置
「X は Y に整合的である」
X という文字コードが Y という規約に従っている
包摂基準
あるコードがどの字体の集合と対応するか
その他知識
JIS の規格名
「JIS X 0208」などと表記されるうち「X」は部門番号で情報系であることを示し「0208」は番号を示す
番号は制定年や月日とは関係ない(はず)
符号化文字集合
ASCII
American Standard Code FOr Information Interchange
128種
ISO/IEC 646
一部のコードが各国ごとにおきかえ
ASCII(各国版)
ISO/IEC 2022
ほとんどの文字コードの基礎?
8bit も 2byte コードもいけるらしい
JIS X 0201
ISO/IEC 646 の日本語版
英字の代わりに半角カタカナを収録
JIS X 0208
ISO/IEC 2022 に沿った規格
JIS 漢字などを定義している
JIS X 0213
JIS X 0208 では足りなかった文字を追加とか
16 bits の文字コード
文字符号化方式
UTF-16
サロゲートペアのやつ
こいつが源流?
PDF とか JavaScript が UTF-16 で文字を管理しているのはその流れ?
UTF-8
大部分は UTF-16 と同じだけど(?)8 bit で ASCII 互換性もある
UTF-8 は 1, 2, 3 バイトで Unicode のコードポイントを表すが 2, 3 バイトで表現する場合、すべてのバイトは 0x7f より大きいので ASCII と誤解されない
Shift_JIS
JIS X 0201 に加えて空いているスペースで JIS X 0208 を表現
GL に ASCII を GR に JIS X 0208 を呼び出すとは?
最初は特に「GR に JIS X 0208を呼び出す」が分からなかった
JIS X 0208 は 94*94 の文字集合なのて GR に収まらない?という疑問
そうではなく JIS X 0208 の場合は 2 バイトで 1 文字なので「GR の範囲のバイトを 2 つを使って JIS X 0208 の符号化文字集合を表現する」という意味と理解した
全角と半角の「A」の存在理由
JIS X 0208 などの1文字に2バイトを当て符号化文字集合は「A」などの文字も含んでいる
JIS X 0201 と JIS X 0208 を混合する Shift_JIS などの文字符号化方式の場合1バイトの「A」と2バイトの「A」が存在することになる
当時の文字表示の事情により1バイトは半角、後者は2バイトは全角で表示されることがあった
結果、半角と全角の「A」が生まれた
半角と全角の「A」の本質的な違いはなく、大きさが違うのもフォントの実装次第
バックスラッシュと円
ASCII ではバックスラッシュ、JIS X 0201 では円
つまり、例えば UTF-8 ではバックスラッシュ、Shift_JIS ては円ということになる
しかし UTF-8 であっても日本語フォントだと気を利かせてバックスラッシュを円のように表示するものがある(!)
符号化文字集合ではバックスラッシュを意味するのにもかかわらず