〜が文字化けした

at 2016-08-03 00:00 (UTC)

UTF-8が浸透して随分楽になったが、外部システム連携なんかではまだまだShift_JIS変換は避けられないこのご時世、いかがお過ごしでしょうか。

先日、Java でソースコードにベタで書いた “〜” が Shift_JIS(MS932) で出力すると文字化けした。 調べてみると 0x301c に変換されていた。変換して欲しいのは 0xff5e である。

たぶん mac で書いているせいで、http://blog.sakurachiro.com/2012/09/tilda/ ここらへんの話だろう。 Windowsでソース書けばちゃんと変換されるとか、sinθじゃなくて -sinθのほうで出力すれば大丈夫とか聞いたが、いちいち開発機を切り替えるのもいやだし、-sinθなんて絶対出し方忘れる。

というわけで、文字列じゃなくて Character durationChar = Character.valueOf((char)65374); とかやって逃げた。

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class MS932Map {
    public static void main(String[] args) {
        File file = new File("MS932Map.csv");
        BufferedWriter out = null;
        try {
            out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "MS932"));
            for (int i = 1; i < Character.MAX_VALUE; i++) {
                out.write(String.format("0x%x,%d,%c\n", i, i, (char) i));
            }
            out.flush();
        } catch (Exception ex) {
            System.err.println(ex);
        } finally {
            try {
                out.close();
            } catch (IOException ex) {
                System.err.println(ex);
            }
        }
    }
}

こんな感じで出力したMS932マップを持っておくとこういう時便利。