谷本 心 in せろ部屋 このページをアンテナに追加 RSSフィード Twitter

2011-06-14

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

ちょっと久々のJavaネタですが、

前から書き溜めていた、文字コードエンコードについてのノウハウを書きます。

今回は、詳細な説明に入る前に、前提になる知識や用語について説明しておきます。

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

新人くん「では、HTML文字コードUTF-8でお願いします」

先輩社員「文字コードじゃなくてエンコーディングでしょ?」

新人くん「えっ。あぁ、はい、それで」

文字コードエンコードエンコーディング)を混同して使ったりすると、

ちょっと原理主義的な人に怒られたりするんですけど、

大まかに言えば、「文字コード」は文字に割り当てられた「数字」のことで、

エンコード」は文字と数字をマッピングする「方式」のことだと捉えていれば、大きくは外れません。


ただ、「文字コード」という言葉は、「数字」「方式」の両方で使われるほか、

文字一覧を示す「Charset」という意味で使われることもあります。


もし「UTF-8文字コードじゃない!」って怒られたら

「Wikpediaには『日本では、EUC-JPShift_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

なお、厳密に言うとここで指定するUnicodeはUTF-32のコードです。

詳しくは、またサロゲートペアについて説明する時にお話しします。

文字コード(Shift-JISJISUnicode) → 文字

MS-IMEをONにした状態で文字コードを打ち込み、

F5キーを押せば、その文字コードに対応した文字に変換できます。

文字コードには、Shift-JISJIS、区点コード、Unicodeと、幅広いものが利用できます。

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

文字 → 文字コード(Shift-JISUnicode

MS-IMEには、IMEパッドという文字一覧が付属しています。

ここから頑張って対象の文字を見つければ、

その文字の文字コードを確認することができます。

ネットで検索

ネットによくある文字コード一覧表や、文字定義の検索サイトなどで

確認するのも良い方法でしょう。


http://ash.jp/code/unitbl21.htm

JISコードの範囲内の文字列なら、このサイトにまとまっています。


http://www.fileformat.info/info/unicode/index.htm

こちらは、文字や文字コードの詳細を検索できるサイトです。


ただし、上に挙げた両方のサイトとも、

Unicodeの文字についてはUnicodeコンソーシアムの定義を利用しているため

全角バックスラッシュなど、一部にマッピングの怪しい箇所があります。


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

まとめ

  • 文字コードエンコード、文字セット、Charsetなどの言葉は一通り理解しよう。
  • そのうえで、「Windows-31j」「UTF-8」などは「Charset」と呼ぶのが無難。
  • 文字と文字コードの相互変換方法は、WordやIME、あるいはネットを利用しよう。

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

ToMmYToMmY 2011/06/15 10:53 Mac, Unix ユーザの方に。
すごく限定的ですが、 emacs で DDSKK をつかっていれば、 $ キーで文字コードがわかり、文字コードから文字を入力する方法もあります。
複数のエンコーディングに対して文字コードを教えてくれて便利です。

SS 2011/06/16 08:59 はてブ経由でのぞいてみたら、セロさんのページだったとは!
もうゲームは完全に引退されてるんでしょうか。。。

cero-tcero-t 2011/06/17 00:01 id:ToMmYさん
そんな方法があるんですね。ありがとうございます。

ブクマかTwitterでは、Mac用のCotEditorでも1文字選択すれば文字コードが分かる、
というコメントを頂きました。


>Sさん
社会人になってからは、ほぼやってないねー。
スティックをキーボードに持ち替えて、夜な夜なプログラミングしてます。

mmxmmx 2011/06/17 18:31 [文字コード」は文字に割り当てられた「数字」→ 論理番号
エンコード ⇒ 具体的な ビットイメージ

数字を直接 二進で表した 自明なエンコード もありますが、処理系の内部では。

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


画像認証