読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

String#getBytes()ではまる。

Java

文字列をバイト配列に変換する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の設定によるのかもしれません。ということで、文字セットはちゃんと明示した方が良さそうです。