読者です 読者をやめる 読者になる 読者になる

Bonkura - Kenny

SIerで働く文系SEの記録

【読書メモ】プログラマのための文字コード技術入門_その1

読書メモ 文字コード

【読書メモ】プログラマのための文字コード技術入門 文字コード技術入門を一通り読んだので、読みながらメモしていった内容を残しておきます。

プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ)

プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ)

用語集

  • 文字コード、符号化文字集合
    符号・文字集合を定め、その集合内の文字とビット組み合わせを1:1に対応付けるあいまいでない規則の集合

  • 符号化
    →事物を01の符号で表現すること

  • 符号化方式
    複数の符号化文字集合を組み合わせたり符号を計算によって変形したりする運用方式

  • 符号位置(コードポイント)
    文字表の中の位置を示す。

  • 文字化け
    異なる文字コードで符号化されたデータを解釈しようとする

  • 外部コードと内部コード
    →システム内部で処理用に使われる内部コードと入出力に使われる外部コードは同じでなくてもよい

  • 制御文字(0/0~0/15)⇔図形文字

  • 重複符号化
    →1つの文字が複数バイト表現を持つこと。原則として行わない。

  • コード変換
    →符号化されたテキストの文字を変えずにコードだけを変換する。変換が正しく行われたか、という点については、変換元・変換先の双方の文字コードの定義に照らして判断する。

  • 自動判別
    →テキストデータの文字コードの種類が明示されていない時に、バイト列の特徴から文字コードの種類を判断すること。

  • 包摂基準
    →ある区点位置がどのような字体差を含み包むか?

  • 外字(=機種依存文字
    →足りない文字を文字コード表の空き領域に独自に割り当てて使用した時の字 ※携帯電話の絵文字とか。

  • 文字符号化形式
    複数の符号化文字集合を組み合わせたり符号を計算に寄って変形したり、、といった運用方式。

  • ビッグエンディアン
    →2バイト以上のデータを上位バイト(左側)から数える順番

  • トルエンディアン
    →2バイト以上のデータを下位バイト(右側)から数える順番

忘れがちな前提知識

  • 8ビット=1バイ
  • 右から順に第一ビット(b1)、第二ビット(b2)… 
  • 左が上位、右が下位。
  • 1バイトで2の8乗(256種類)の情報を符号化
  • 0x05 や 7E =1バイト A8 E2=2バイ
  • 16進数の場合は接頭辞に「0x」をつける。
  • 8ビットコード →第8ビット(一番左)を用いる文字コード
  • 2バイトコード →2バイト(16ビット)で1文字を表す文字コード。94×94の最大8836文字を収録できる。 ex)SJISでの"あ" → 82 A0

符号化文字集合の歴史と概要

文字コードの誕生

  • ASCII:アメリカの規格(1960年代) 1バイト7ビット
    通貨記号が$しかなかったりするので、ASCIIだけだとほかの国が対応出来ない。。

  • ISO/IEC 646 →各国の都合に応じて文字を変更してもよい符号位置が明確化
    ex)日本:JISX0201
    But!複数の言語が混在出来ない。

  • ISO/IEC2022 →ASCIIを拡張し、8ビットや2バイトコードが可能。呼び出しの概念を用いることで、複数の符号化文字集合を組み合わせる事が可能。
    ※世界中の文字集合を組み合わせる、といった用途より、ASCII+自国用の文字集合 くらいの使われ方に留まった。

2バイト符号化文字集合の実用化

  • JISX0208 →ISO/IEC2022に則った2バイト符号化文字集合の先駆け ※2バイトはいいんだけど、元々1バイトで表現されていた文字はどうする?全部2バイトに置き換えるわけにもいかない。。
    →既存の1バイトコートで表現できる文字は従来通りに。それ以外を2バイトコードで扱えるようにする運用方法が必要に。

  • Shift_JIS,EUC-JP,ISO-2022-JP → JISX0208をASCIIやJISX0201等の1バイトコードと組み合わせて運用する。

国際符号化文字集合の模索と成立

グローバル化・コンピュータ処理能力の向上に伴い、「世界中の文字を一つの文字集合に収めた文字コードを作ろう!」という動きが勃興。

  • ISO/IEC20646
    →ISO/IEC2022に基づいて互換性を保とうとした。4バイトで1文字。
  • Unicode(=ISO/IEC10646,UCS)
    →既存の規格との互換性は乏しく16ビット(2バイト)の固定幅で1文字を表現する。

二つの規格が並行して開発されていたので、マージされる。
→4バイトという建前は残しつつ16ビット(2バイト)固定というUnicodeの設計を反映して下位2バイトの領域内にすべての文字を配置した実質2バイトの符号化文字集合
→16ビットにとても収まりきらないので破綻!!
→16ビットのUnicodeとの互換性を保ったまま拡張部分の文字を扱う手段を模索
UTF-16,UTF-8など、拡張を繰り返し、複雑に。。一斉に古い文字コードから移行とはいかなくなった。

UnicodeUTF-8の違いメモ

  • Unicode:整数値で表される符号位置と文字とを対応付けている
  • UTF-8:整数値で表される符号位置をバイト列の形で表現するための方式の一つ

山の符号位置:「U+5C71」はUnicodeで決まっている。

長くなったので、続きは後半で。