いいから聞け! 俺が文字コードについて教えてやるよ その1(前提知識編)
ちょっと久々のJavaネタですが、
前から書き溜めていた、文字コードやエンコードについてのノウハウを書きます。
今回は、詳細な説明に入る前に、前提になる知識や用語について説明しておきます。
文字コードとエンコードって違うの?
新人くん「では、HTMLの文字コードはUTF-8でお願いします」
先輩社員「文字コードじゃなくてエンコーディングでしょ?」
新人くん「えっ。あぁ、はい、それで」
文字コードとエンコード(エンコーディング)を混同して使ったりすると、
ちょっと原理主義的な人に怒られたりするんですけど、
大まかに言えば、「文字コード」は文字に割り当てられた「数字」のことで、
「エンコード」は文字と数字をマッピングする「方式」のことだと捉えていれば、大きくは外れません。
ただ、「文字コード」という言葉は、「数字」「方式」の両方で使われるほか、
文字一覧を示す「Charset」という意味で使われることもあります。
もし「UTF-8は文字コードじゃない!」って怒られたら
「Wikpediaには『日本では、EUC-JP、Shift_JIS、UTF-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」という概念は
「文字集合」と「エンコード」の両方を含んだものになっています。
WikipediaやJavadocなどに、その辺りについての記述があります。
また、文字集合の似た用語として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
なお、厳密に言うとここで指定するUnicodeはUTF-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の定義や解釈については、またいずれ詳しく説明しますね。