Hatena::ブログ(Diary)

今日もスミマセン。

Do you follow me?

2010-07-10

文字コード(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コード になる。

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+0000007F0xxxxxxx1バイト
U+00000080 〜 U+000007FF110xxxxx 10xxxxxx2バイト
U+00000800 〜 U+0000FFFF1110xxxx 10xxxxxx 10xxxxxx3バイト
U+00010000 〜 U+0010FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx4バイト

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

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

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

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

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

  • ISO-2022-JP で文字集合を切り替えるエスケープシーケンスについて
  • EUCで文字集合を切り替えるシングルシフトについて
  • Unicodeでの文字の合成について
  • UTF-16でのバイトオーダー,サロゲートペアについて

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

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

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

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

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

sorgsorg 2010/07/11 17:31 ISO-2022-JPの文字コードの求め方の図で、愛が0x3020になってますが0x3026の間違いですかね

snaka72snaka72 2010/07/11 18:30 直しましたー。ありがとございます。

nliznliz 2010/07/11 21:34 文字コード = 文字集合 + 文字符号化方式
でしたっけ?

通りすがり通りすがり 2010/07/11 23:37 キャラクタセット(charset;文字集合)、エンコーディング(encoding;符号化方式)という言葉の方が、漢字で書くよりも通りが良いと思います。

通りすがり2通りすがり2 2010/07/12 05:42 厳密に言うと異なる文字集合に対して同一の文字符号化方式を用いたり、複数の文字集合や文字集合の組み合わせに対する文字符号化方式が存在したりするので文字コード定義は規格によって違ったりします。

面倒なので個人的には文字コードと言う言葉は極力使用しないようにしてます。

とおりすがりとおりすがり 2010/07/12 13:40 >愛が0x3020になってますが0x3026の間違いですかね
>>直しましたー。

0x30 とくっつける前のとこが 0x20 のままですよ

通りすがり3通りすがり3 2010/07/12 15:24 よくわかりませんが愛を感じました

snaka72snaka72 2010/07/13 00:50 いろいろコメントありがとございます。自分で読みなおしてみてもなんか変なとこありますね。
ここ数日忙しくなりそうなので落ち着いたら、もうすこしちゃんと調べて直しますー。

snaka72snaka72 2010/07/13 07:54 >0x30 とくっつける前のとこが 0x20 のままですよ
ああ、見落としてました。直しました

ななしななし 2010/07/18 00:05 大学の授業の補足としておおいに参考にさせていただきました。
ありがとうございます!

KatzKatz 2010/10/24 16:13 各規格の利点とか欠点とか考え始めると鬱陶しいんですよね…
「日本語だけ」考えるなら比較的わかりやすいと思うんですが。

個人的には、Unicodeは国家規格を無視している事を明記して欲しかったりします。
他にも、EUCだって多言語対応は簡単なはずですし、純粋に技術的な観点から言えば。
まあその辺を突っつくと宗教論争が巻き起こるのでテキトーな所でまとめるのが吉だとは思います。

alal 2016/05/02 14:40 【Shift_JISの求め方】
第2バイトの計算ですが「区が奇数の場合」以下の条件は
「区が1〜63の場合」ではなく
「点が1〜63の場合」の場合ではないでしょうか?

alal 2016/05/02 14:41 【Shift_JISの求め方】

第2バイトの計算ですが「区が奇数の場合」以下の条件は
「区が1〜63の場合」ではなく
「点が1〜63の場合」の場合ではないでしょうか?

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

リンク元