ちょっと MT とソースコードの共有を試してみる...

めちゃ古い記事で恐縮...

Think Different. – A dream does not escape. but I always escapes.

Struts で メールフォームを作って、 velocity を使ってメールの本文を生成、 JavaMail で送信という処理をする際、 Windows から入力した 「〜」などの一部の特殊記号が文字化けしてしまうことがあります。
ちなみに、エンコーディングは、 JavaJSP、velocity のテンプレートがすべて utf-8、メールは iso-2022-jpです。
Mac からの入力は問題なし。
Windows から入力された「〜」等の一部の特殊記号は、 Windows-31Jエンコーディングで送信され、 Servletutf-8 に変換、 JavaMail で MimeMessage に入力する際、 iso-2022-jp に変換されます。
このとき、 Windows から入力された「〜」の character code は、 iso-2022-jp や、SJISEUC での「〜」である、\u301c とは違い、 \uff5e であるため、コード変換が出来ずに文字化けしてしまいます。
参考 - Javaの日本語関連コンバータにおけるマッピングの違い
http://www.ingrid.org/java/i18n/encoding/ja-conv.html

この問題を対処するため、 Windows-31J や MS932 といったコードで入力した際、文字化けを起こす特殊文字の character code を iso-2022-jpEUC で使用されている character code へ変換するメソッドを作りました。

    public static String winToJIS(String input) {
        StringBuffer sb = new StringBuffer();
        char c;
        for (int i = 0; i < input.length(); i++) {
            c = input.charAt(i);
            switch (c) {
            case 0xff3c: // 「\」 を変換
                c = 0x005c; 
                break;
            case 0xff5e: // 「〜」を変換
                c = 0x301c; 
                break;
            case 0x2225: // 「‖」を変換
                c = 0x2016; 
                break;
            case 0xff0d: // 「−」を変換
                c = 0x2212;
                break;
            case 0xffe0: // 「¢」を変換
                c = 0x00a2;
                break;
            case 0xffe1: // 「£」を変換
                c = 0x00a3;
                break;
            case 0xffe2: // 「¬」 を変換
                c = 0x00ac; 
                break;
            }
            sb.append(c);
        }
        return sb.toString();
    }