谷本 心 in せろ部屋

はてなダイアリーから引っ越してきました

いいから聞け! 俺が文字コードについて教えてやるよ その1(前提知識編)

ちょっと久々のJavaネタですが、
前から書き溜めていた、文字コードエンコードについてのノウハウを書きます。
今回は、詳細な説明に入る前に、前提になる知識や用語について説明しておきます。

文字コードエンコードって違うの?

新人くん「では、HTMLの文字コードUTF-8でお願いします」
先輩社員「文字コードじゃなくてエンコーディングでしょ?」
新人くん「えっ。あぁ、はい、それで」

文字コードエンコードエンコーディング)を混同して使ったりすると、
ちょっと原理主義的な人に怒られたりするんですけど、
大まかに言えば、「文字コード」は文字に割り当てられた「数字」のことで、
エンコード」は文字と数字をマッピングする「方式」のことだと捉えていれば、大きくは外れません。


ただ、「文字コード」という言葉は、「数字」「方式」の両方で使われるほか、
文字一覧を示す「Charset」という意味で使われることもあります。


もし「UTF-8文字コードじゃない!」って怒られたら
「Wikpediaには『日本では、EUC-JP、Shift_JISUTF-8の3つが良く使われている文字コードである。』って書いてます!」
って反論すれば、話をややこしくできるかも知れません。
http://ja.wikipedia.org/wiki/文字コード

文字集合、文字セット、charsetって何だ?

新人くん「では、HTMLの文字コードWindows-31jでお願いします」
先輩社員A「文字コードじゃなくてエンコーディングでしょ?」
先輩社員B「むしろ厳密に言うならCharsetの方が良くない?」
新人くん「えっと・・・」

文字コード」「エンコード」と並んでよく使われる言葉に「Charset」があります。
日本語訳すると「文字セット」とか「文字集合」という言葉になるのですが、
よくよく調べてみると「文字集合」と「Charset」は、若干、含む意味が異なっているようです。


文字集合」をWikipediaで調べてみたところ、
厳密な意味では、「Unicode」という「文字集合」に対して「UTF-8」「UTF-16」などの「エンコード」方式がある、
同様に、「JIS X 0208」という「文字集合」に対して「ISO-2022-JP」「EUC-JP」「Shift_JIS」などの「エンコード」方式がある、
という対応付けになるようです。


また、Javaエンジニアである私たちも利用機会が多い「Windows-31j」は
JIS X 0201」「JIS X 0208」という「文字集合」に
NEC特殊文字」と「IBM拡張外字」を加えた、「文字集合」だと言うことになります。


では、「Windows-31j」という文字集合に対するエンコード方式は?
と聞かれると、「Windows-31j」としか答えられません。


そうなんです。
結局のところ、文字集合エンコードは、なかなか切り離せない関係なんです。
そんな背景もあってか、IANAが決めた「Charset」という概念は
文字集合」と「エンコード」の両方を含んだものになっています。


WikipediaJavadocなどに、その辺りについての記述があります。

また、文字集合の似た用語としてMIME等で利用されるIANAのcharsetがあるが、charsetは符号化文字集合文字符号化方式を合わせた概念であり、名称と実態が一致していない。

文字集合 - Wikipedia

このクラスの名前は、RFC 2278 で使用されている用語に由来しています。このドキュメント内で、「文字セット」はコード化文字集合と文字エンコーディング方式の組み合わせとして定義されています。

Charset - Java Platform SE 6


要するに、「Charset」は「文字集合」と「エンコード」を含めた、
実用上使いやすい用語だと覚えておけば、間違いないでしょう。
Shift_JIS」も「UTF-8」も「Windows-31j」も、みーんな「Charset」って呼ぶことができます。
なので、面倒くさい人と話す時には「Charset」と言っておけば大丈夫です。


ちなみにCharsetの読み方は「チャーセット」派と「キャラセット」派がいるようですが、
私は「チャーセット」派です。


キャラセットならcharasetだろ、JK。

どうすれば文字の文字コードを確認できるの? また、その逆は?

新人くん「『あ』の文字コードを調べたいんですが、どうすれば良いですか?」
先輩社員「文字コード一覧を検索するのが、手っ取り早いかな」
新人くん「なるほど。では逆に文字コードから、対応する文字を調べたい時は、どうすれば良いですか?」
先輩社員「少しはググってみれば?」

文字コードについて調べ始めると、
文字コード(「0x82a0」)と文字(「あ」)を相互変換したくなる機会が、とても増えてきます。
どういう方法でやれば簡単に変換できるのか、いくつかの手法を説明しましょう。


ここで紹介する方法は基本的にWindows向けなので、
もしMacでの上手い変換方法などあれば、コメントでお知らせください。

Unicode(UTF-32) ⇔ 文字

Windowsに付属のワードパッドかMicrosoft Wordを開き、
文字を入力してから「Alt + X」を押下してください。
文字と文字コードUnicode)を相互変換することができます。

3042 → (Alt + X) → あ → (Alt + X) → 3042

なお、厳密に言うとここで指定するUnicodeUTF-32のコードです。
詳しくは、またサロゲートペアについて説明する時にお話しします。

文字コード(Shift-JIS、JIS、Unicode) → 文字

MS-IMEをONにした状態で文字コードを打ち込み、
F5キーを押せば、その文字コードに対応した文字に変換できます。
文字コードには、Shift-JIS、JIS、区点コード、Unicodeと、幅広いものが利用できます。

82あ6 → (変換確定前にF5) → 芦、え

文字 → 文字コード(Shift-JIS、Unicode

MS-IMEには、IMEパッドという文字一覧が付属しています。
ここから頑張って対象の文字を見つければ、
その文字の文字コードを確認することができます。

ネットで検索

ネットによくある文字コード一覧表や、文字定義の検索サイトなどで
確認するのも良い方法でしょう。


http://ash.jp/code/unitbl21.htm
JISコードの範囲内の文字列なら、このサイトにまとまっています。


http://www.fileformat.info/info/unicode/index.htm
こちらは、文字や文字コードの詳細を検索できるサイトです。


ただし、上に挙げた両方のサイトとも、
Unicodeの文字についてはUnicodeコンソーシアムの定義を利用しているため
全角バックスラッシュなど、一部にマッピングの怪しい箇所があります。


Unicodeの定義や解釈については、またいずれ詳しく説明しますね。

まとめ


次回はJavaでの文字コードの扱いについて解説します。