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
がある。