String#getBytes()ではまる。
文字列をバイト配列に変換するString#getBytes()ですが、環境によってエンコードで使われるデフォルトの文字セットが違うため、注意が必要です。「デフォルトはUTF-8」とか思い込んでいて、だいぶさまよってしまいました・・・。String#getBytes()の実装をみると、「Converters.getDefaultEncodingName()」(※注:sunパッケージのクラス)で文字セットを解決しているようなので、確認するコードを書いてみました。
public static void main(String[] args) throws UnsupportedEncodingException { // String#getBytes() で利用している文字セットを表示 System.out.println(Converters.getDefaultEncodingName()); dump( "あああ".getBytes() ); dump( "あああ".getBytes("UTF-8") ); } // バイト配列を16進数表現で出力する。 public static void dump( byte[] bytes ) { System.out.print( "[ " ); for ( int i = 0 ; i < bytes.length; i++ ) { System.out.print( "0x" + String.format("%1$02X", bytes[i]) + " " ); } System.out.print( "]\n" ); }
実行結果。Windowsの場合。
MS932 [ 0x82 0xA0 0x82 0xA0 0x82 0xA0 ] [ 0xE3 0x81 0x82 0xE3 0x81 0x82 0xE3 0x81 0x82 ]
Linuxの場合。
UTF-8 [ 0xE3 0x81 0x82 0xE3 0x81 0x82 0xE3 0x81 0x82 ] [ 0xE3 0x81 0x82 0xE3 0x81 0x82 0xE3 0x81 0x82 ]
Linuxだと、UTF-8になりましたが、OSの設定によるのかもしれません。ということで、文字セットはちゃんと明示した方が良さそうです。