我们的应用程序需要的文本从一个网页形式发送电子邮件向一个适当的用户。然而,当一个人复制/糊的臭名昭着的"智能报价"或其他特殊字符字,得到毛茸茸的。

用户的类型

他说"你好"对我来说—是不是很好吗?

但当信息出现在Outlook2003年,它出来像这样:

他说你好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。因此,我更新的码正是如此:

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);

这让我更加接近,但没有雪茄:

他说,A"helloÂ"以me—心不是很好吗?

我不能想象这是不常见的问题-什么我错过了什么?

有帮助吗?

解决方案

时与你的表格也使用UTF-8,或不同的字符集的页面?如果没有指定网页的字符集,数据来你的脚本的格式是任何人的猜测。


编辑:在消息中的字符集应设置是这样的:

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

,因为字符集不是一个单独的头,但是一个选项,以内容类型

其他提示

你为什么不更换总理定期报价漂亮的报价?

我会检查的数据收到的浏览器是正确的-把Unicode码和检查它们针对的 图表:

  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));
    }
  }

例如,象征双左引号()是符U+201C。

它已经很长一段时间以来我用邮件API,但是 MimeMessage.html。调用(文本、charset) 方法可能是值得看一看。该文件 调用(String) 说它采用了默认字符组(可能windows-1252如果你使用的语/英语拉丁语-1Windows)。

IIRC,MS Office的报价被发现字符集 “ISO-8859-1”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top