2014年6月2日月曜日

Classファイルの文字コード

30億のデバイスで化けないJava。

Shift_JISとSJISは必ずしも一致しなかった。
文字コードはUTF-8に統一されつつあるが、未だに悩ましい問題の一つだ。

JavaのClassファイルとAndroid

.javaファイルはコンパイルすると.classファイルになる。
AndroidのDalvikVMではこのClassファイルをDxにより、
1つのclasses.dexなるファイルにまとめる。

Classファイルの文字コード

Javaファイルを書くときはその文字コードを気にすることもあるだろう。
(とはいえUTF-8一択だ。「気にする」というのはUTF-8になっているかどうかを気にするのだ)

しかしClassファイルの文字コードを気にしたとこはあるだろうか?

Shift_JISでエンコードされたJavaファイルをClassファイルにコンパイルしたとしよう。
クラスローダーはこのClassの文字コードをどのように判断しているのだろうか。

答えは簡潔である。
Classファイルにおいて文字列の文字コードは統一されているのだ。

UTF-8っぽいやつ

Classファイルのなかで文字列は「UTF-8っぽい」文字コードで表現される。
それゆえ、Javaはコンパイル後に文字化けすることがない。

指定するタイミング

JavaファイルをClassファイルにコンパイルするときに、Javaファイルの文字コードを指定してあげる。
javacのオプションに-encodingがある。

http://www.glamenv-septzen.net/view/86