2009-05-19 13 views
1

私たちのアプリケーションは、Webフォームからテキストを取り出し、電子メールで適切なユーザーに送信します。しかし、誰かが悪名高い "スマート引用符"やWordからの他の特殊文字をコピー/ペーストすると、事態が激しくなります。MimeMessageのスマート引用符がOutlookに正しく​​表示されない

におけるユーザーの種類、彼は素敵なことを私-isn'tに「こんにちは」と述べましたか?

しかし、メッセージがOutlook 2003で表示されたとき、それは次のように出てくる:彼はその素敵なをmeisntするハローを言っ

?このため

コードはでした:

Session session = Session.getInstance(props, new MailAuthenticator()); 
Message msg = new MimeMessage(session); 

//removed setting to/from addresses to simplify 

msg.setSubject(subject); 
msg.setText(text); 
msg.setHeader("X-Mailer", MailSender.class.getName()); 
msg.setSentDate(new Date()); 
Transport.send(msg); 

は少し研究した後、私はこれはおそらく、文字エンコーディングの問題だった考え出しとUTF-8に物事を移動しようとしました。だから、私はthuslyコードを更新:

Session session = Session.getInstance(props, new MailAuthenticator()); 
MimeMessage msg = new MimeMessage(session); 

//removed setting to/from addresses to simplify 

msg.setHeader("X-Mailer", MailSender.class.getName()); 
msg.addHeader("Content-Type", "text/plain"); 
msg.addHeader("charset", "UTF-8"); 
msg.setSentDate(new Date()); 
Transport.send(msg); 

これは近い私を得たが、何の葉巻:

彼は、MEA-isnÂ'tにÂ「helloÂは」素敵なことを言っていませんか?

私はこれが珍しい問題ではないと思います。私は何を欠いていますか?

+0

charsetはContent-Typeオプションで、別々のヘッダーではありません。そうでなければ、それは良い見ている。 – Piskvor

答えて

1

あなたのフォームのページもUTF-8を使用していますか、別の文字セットですか? Webページの文字セットを指定しない場合、スクリプトに送られるデータの形式は誰でも推測できます。


編集:メッセージのcharsetは次のように設定する必要があります。

msg.addHeader("Content-Type", "text/plain; charset=UTF-8"); 

文字セットが別のヘッダーではなく、コンテンツタイプにオプションが

+0

ページの文字セットを設定しようとします。 (UTF-8へ)。私はペーストされた文字を変換するのはエクスプローラに任されていると思います。 "test" – KarlP

0

素敵な引用符を通常の素引用符で置き換えてみませんか?

+1

これは確かに選択肢ですが、「をと置き換えてください」というルールを作成しなければならない場合は、私はしたいと思います。 – abeger

0

私がいることを確認しますので、ブラウザから受け取ったデータは正しいです - ユニコードコードポイントをダンプしてchartsと照合して確認してください:

public static void printCodepoints(char[] s) { 
    for (int i = 0; i < s.length; i++) { 
     int codePoint = Character.isHighSurrogate(s[i]) ? Character 
      .toCodePoint(s[i], s[++i]) 
      : s[i]; 
     System.out.println(Integer.toHexString(codePoint)); 
    } 
    } 

たとえば、シンボルDOUBLE LEFT QUOTATION MARK(&#x201C;)は文字U + 201Cです。

私はmail APIを使用して以来長い時間がかかりましたが、MimeMessage.html.setText(text, charset)メソッドは一見価値があるかもしれません。 setText(String)のドキュメントでは、デフォルトの文字セット(英語/ラテン語-1のWindowsを使用している場合はおそらくwindows-1252)を使用しています。

0

IIRC、MS Officeの引用符は、「iso-8859-1」という文字セットにあります。

+0

いいえ、そうではありません。彼らは多くのMS Officeコードページにあり、その一部は対応するISOラテン文字セットのか​​なり近い "包含と拡張"バージョンです。 – tripleee

関連する問題