文字コード(UTF-8,Shift_JIS,EUC-JP,ISO-2022-JP)についての俺的まとめ
「プログラマのための文字コード技術入門」を読んで自分なりに理解した点をザックリとまとめてみる。
それほど正確性を求めて書いているわけではないので、間違ってる可能性大です。
間違いなどあればコメントなど頂けるとありがたいです。
それぞれの文字コードはどう違うのか?
日本語の文字コードは大きく以下の2つに分けられる
- JIS X 0208 文字集合をベースにしたもの
- Unicode文字集合をベースにしたもの
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コード になる。
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シリーズ)
- 作者: 矢野啓介
- 出版社/メーカー: 技術評論社
- 発売日: 2010/02/18
- メディア: 単行本(ソフトカバー)
- 購入: 34人 クリック: 578回
- この商品を含むブログ (129件) を見る
*1:シフトイン、シフトアウトの考え方さえなければ...