文字のこと 主に日本語の取り扱い、歴史
以下はwaybackにしかない良記事のまとめ
他の参考:
- JIS X 0213の代表的な符号化方式: https://www.asahi-net.or.jp/~wq6k-yn/code/enc-x0213.html
- Unicode org: https://www.unicode.org/charts/charindex.html
- JIS規格: https://www.jisc.go.jp/app/jis/general/GnrJISSearch.html
- Shift_JIS-2004 (JIS X 0213:2004) vs Unicode mapping table: http://charset.info/sjis-2004-std.txt
ASCII
- 0x00~0x1F: 制御文字
- 0x20: 空白
- 0x21~0x7E: 図形文字(アルファベット等)
- 0x7F: 制御文字(DEL)
つまり、7ビットで完結
0x5C: バックスラッシュ、0x7C: 縦棒、0x7E: チルダ などは昔々はベンダや地域ごとに違っていた。いまでも5Cは日本のwindowsでは\マークになっている
7Eはパンチカードで全ビットが1で全削除を表すことの名残りらしい
JISコード
ASCIIに加えて、
- 0x21~0x5F: 7ビットの場合半角カタカナ(昔は1文字7ビットで表す形態があった)
- 0xA1~0xDF: 8ビットの場合半角カタカナ
- 02121~0x7E7E: 漢字・補助漢字(第一バイト、第二バイトともに、21~7E)
を使う文字コード。
2121~7E7E→JIS規格の例えばJIS X 0208 の[本体009」「附属書6(規定)漢字の分類及び配列」に含まれる16区1点~84区6点の、亜: 3021のことを言う。
”補助漢字”の定義、JIS X 0208, 0212, 0213など規格の詳細は後述。
Shift-JIS(MS漢字コード)
マイクロソフトなど数社が策定した漢字コード
ASCII、半角カナはJISと同じ。
漢字は、
0x8140~0x9FFC(第一バイト: 0x81~0x9F、第二バイト: 0x40~0x7E)
0xE040~0xFCFC(第一バイト: 0xE0~0xFC、第二バイト: 0x80~0xFC)
所定の計算式によりJISコードを変換している。
EUC(日本語EUC)
Extended Unix Codeの略。日本語の他に、中国語EUC、韓国語EUCなどがある。
制御文字、英数はASCIIと同じ。
- 漢字: 0xA1A1~0xFEFE(第一第二バイトとも、0xA1~0xFE)
- 半角カナ: 0x8EA1~0x8EDF
- 補助漢字: 0x8FA1A1~0x8FFEFE(3バイト表記)
漢字のA1A1~はJISと同じ順番で振っているので変換が簡単。
JIS規格、JIS漢字
- JIS X 0208などは、JIS規格で誰でも確認できる。(メールアドレスで会員登録が必要)
- JIS X 0208の規格名は”7ビット及び8ビットの2バイト情報交換用符号化漢字集合”だが、平仮名、片仮名、ラテン文字などを含む
- 歴史的には、JIS X 0208で第一水準・第二水準の規定、JIS X 0212で補助漢字の規定。
- JIS X 0208, 0213では各種文字の符号の定義(2バイトコード)を規定。ただし実装(エンコーディング)は別なので、そのJISで定めた規定をどう実装するかを、JIS X 0208ではシフト符号化 -> Shift-JISコード、ISO 2022 JPを附属書で例示している。JIS X 0213ではそれに加えて、EUCコードも例示している。
- ちなみに、JIS -> Shift-JISは、単純変換ではなくエリアごとに複雑な変換をしているが、ISO 2022 JPとEUCは基本的にJISのコードをそのまま特定のエリアに配置している。例えば、EUCは、JISコードに8ビット目(一番左)に1を立てたコード体系になっている。
- 規格するすべての文字に対して名前を割り当てている。漢字の名前は、CJK-UNIFIED IDEOGRAPH-xxxxとなり、JIS X 0221の規定となっているが、JIS X 0221は”国際符号化文字集合(UCS)”でUnicodeのこと。
ISO 2022(ISO/IEC 2022)
- 複数の文字集合を一つの規格、実装方法で表すための国際規格。JIS X 0202として規定されている。
- 文字だけでISO 2022の仕組みを説明できないので、説明は省略。元記事(wayback)を参照。
- EUC、ISO 2022 JP(JISのエンコーディング)はISO 2022準拠。後者は漢字が始まる場合にシフトコードをつかって表現するが、これがISO 2022の仕組みとなっている。EUCは、シフトコードを使わずにISO 2022に準拠している(ステートレス)。なので、文字集合を韓国語や中国語に置き換えれば、同じように取り扱えるので、中国語EUC、韓国語EUCがある、ということになる。
Unicode(UCS)
- U+0000~U+33FF: A(Alphabet)領域: アルファベット、記号、ハングル、仮名、カナなど
- U+4E00~U+9FFF: I(Ideograph)領域: 漢字領域
- U+AC00~U+D7FF: ハングル
- U+E000~U+F8FF: 私用領域→外字に使われる
- U+F900~U+FFFD: 互換領域→ここにも漢字あり。
漢字領域は、中国・韓国・日本で同定して格納されているため、コードだけではJISと互換がない(並びがバラバラという意味で)。なので、Shift_JIS-2004 (JIS X 0213:2004) vs Unicode mapping tableのような対応表がある。
UTF-16 -> UTF-8への変換
「あ」: 3042:
00110000 01000010
↓
11100011 10000001 10000010
太字が固定値で、その後ろにUTF-16のコードポイントを並べる(つまり、8桁8桁を、固定値を入れつつ4桁6桁6桁に分解して3バイトにする。