文字コード(UTF-8,Shift_JIS,EUC-JP,ISO-2022-JP)についての俺的まとめ

プログラマのための文字コード技術入門」を読んで自分なりに理解した点をザックリとまとめてみる。
それほど正確性を求めて書いているわけではないので、間違ってる可能性大です。
間違いなどあればコメントなど頂けるとありがたいです。

それぞれの文字コードはどう違うのか?

日本語の文字コードは大きく以下の2つに分けられる

JIS X 0208 文字集合をベースにした文字コードには、EUC-JP, Shift_JIS, ISO-2022-JP がある。
Unicode文字集合をベースにした文字コードには、UTF-8, UTF-16 などがある。

上で挙げた「文字コード」とは正確には「エンコーディング文字符号化方式)」の事を指す。

文字集合って?

読んでそのまんま”文字の種類の集まり”。「キャラクターセット」とも呼ぶ。
いちばん単純な文字集合としては、ASCII が挙げられる。ASCIIという文字集合には英字,数字,記号etcなどが含まれている。
日本語を表現するために必要なひらがなや漢字を含む文字集合としては先に挙げた、JIS X 0208 と呼ばれるのものと、よく知られた Unicode がある。
文字集合に登録されている文字はそれぞれ、文字集合の中での位置を識別するための「番号」(符号位置 = Code position とか Code point と呼ばれる)を持っている。

JIS X 0208 なんかでは、「区」と「点」で文字の位置を判別する。分かり易く言うと表の「行」と「列」と読み替えればいい。

JIS X 0208 の区点コードの一覧は以下のURL(注:PDF文書)から参照できる
http://www.itscj.ipsj.or.jp/ISO-IR/168.pdf

一方のUnicodeでは、文字に16進数で値を割り当てていて、16進数の頭に"U+"を付けて U+XXXX という形式で符号位置を表している。

以下、公式ページなどから参照できる。
http://www.unicode.org/charts/

要するに文字コードって何なのか?

Shift_JIS, EUC-JP, UTF-8 などの一般的に「文字コード」呼ばれるものは、それぞれの文字集合に含まれる文字について、その「符号位置」を示す「番号」をそれぞれ独自の手順や計算式によってバイト列の表現に変換したもの。

以下、代表的な文字コード(符号化方式)について、その求め方を説明してみる。

ISO-2022-JP(JISコード)

いちばん簡単*1
コード位置を示す区と点を2バイトの16進数の表現に変換して、それぞれのバイトに0x20を足したものが JISコード になる。

EUC-JP

これも簡単。
コード位置を示す区と点を2バイトの16進数の表現に変換して、それぞれのバイトに0xA0を足したものが EUCコード になる。


Shift_JIS

結構複雑。
計算式を使って求める。下図参照。

UTF-16

サロゲートペアとか考えなければ簡単。コード位置を示す数値がそのままUTF-16のコードになる。ただし、16ビットの数値をバイト列として表現するときにビッグエンディアンとかリトルエンディアンを意識する必要がある。

UTF-8

ASCIIと互換があり、ASCIIの範囲の文字であれば1バイトで表現できて、他の文字コードよりも比較的楽に多言語に対応できるので、現在、広く使われている。
コードの求め方は独特。

以下の図及び表を参照。

”愛”という文字のコード位置 U+611B は下表の3列目に該当する

コード位置 1文字を構成するビット列 バイト数
U+00000000 〜 U+0000007F 0xxxxxxx 1バイト
U+00000080 〜 U+000007FF 110xxxxx 10xxxxxx 2バイト
U+00000800 〜 U+0000FFFF 1110xxxx 10xxxxxx 10xxxxxx 3バイト
U+00010000 〜 U+0010FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 4バイト

文字コード変換とか判別とか...

についても後で書く(予定)

追記:このエントリで書いていないこと

実際のプログラミングでにここに挙げた文字コードを扱う場合、もうちょっと考慮しなければいけないことがあります。

以下の点については、このエントリでは触れていません。

追記:プログラマのための文字コード技術入門

このエントリを書くきっかとなった書籍です。

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

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

*1:シフトイン、シフトアウトの考え方さえなければ...