Main Contents
JavaMail + velocity + ActionForm で「〜」が文字化け
Struts で メールフォームを作って、 velocity を使ってメールの本文を生成、 JavaMail で送信という処理をする際、 Windows から入力した 「〜」などの一部の特殊記号が文字化けしてしまうことがあります。
ちなみに、エンコーディングは、 Java や JSP、velocity のテンプレートがすべて utf-8、メールは iso-2022-jpです。
Mac からの入力は問題なし。
Windows から入力された「〜」等の一部の特殊記号は、 Windows-31J のエンコーディングで送信され、 Servlet で utf-8 に変換、 JavaMail で MimeMessage に入力する際、 iso-2022-jp に変換されます。
このとき、 Windows から入力された「〜」の character code は、 iso-2022-jp や、SJIS、EUC での「〜」である、\u301c とは違い、 \uff5e であるため、コード変換が出来ずに文字化けしてしまいます。
参考 - Javaの日本語関連コンバータにおけるマッピングの違い
http://www.ingrid.org/java/i18n/encoding/ja-conv.htmlこの問題を対処するため、 Windows-31J や MS932 といったコードで入力した際、文字化けを起こす特殊文字の character code を iso-2022-jp や EUC で使用されている 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();
}
これで文字化け解消です。
2008-03-23 追記
古い記事で恐縮...はてなとリンクするテスト.
http://d.hatena.ne.jp/nanasess/20080323/1206255766
- by みそ
- at 2005年10月27日 01:31
- in Java
-
TrackBacks
トラックバックURL:
- »[Java] ちょっと MT とソースコードの共有を試してみる... from Think Different
-
Think Different. - JavaMail + velocity + ActionForm で「〜」が文字化け public static ...
- on 2008年3月23日 16:02
- [Read More]
Comments
>> YSASAKI さん
少しお役に立てたようで光栄です。
Servlet からメール送信する場合、必ずついてまわるトラブルなんですけど、こういうメソッドって、公開されているものが少ないんですよね。
commons の日本語拡張みたいなのを作ると、みんな使ってくれるかな〜、とか思いながら、忙しさに負けてなかなか実現できなかったりしています(汗)
- みそ
- 2007年2月24日 23:41
Post a comment
(Think Different. では不適切なコメントを防止するため、コメントを掲載する前に管理者がコメントの内容を確認しています。コメントを初めて投稿する場合すぐに掲載されませんが、管理者が適切なコメントと判断した場合コメントは直ちに表示されますので、再度コメントを投稿する必要はありません。)
This weblog is licensed under a Creative Commons License.
助かりました!
面倒な文字化け対策が、上記コードで解消しました。
感謝です!