Умные цитаты в MimeMessage не отображаются правильно в Outlook - PullRequest
1 голос
/ 19 мая 2009

Наше приложение берет текст из веб-формы и отправляет его по электронной почте соответствующему пользователю. Однако, когда кто-то копирует / вставляет в печально известные «умные цитаты» или другие специальные символы из Word, все становится волосатым.

Пользователь вводит

он сказал мне "привет" - разве это не мило?

Но когда сообщение появляется в Outlook 2003, оно выглядит так:

он поздоровался со мной, что мило?

Код для этого был:

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

Это сблизило меня, но без сигары:

он сказал «привет» мне - разве это не мило?

Не могу представить, что это необычная проблема - что я пропустил?

Ответы [ 4 ]

1 голос
/ 19 мая 2009

Использует ли страница с вашей формой также UTF-8 или другую кодировку? Если вы не укажете кодировку веб-страницы, формат данных, поступающих в ваш сценарий, будет непонятным.


Редактировать: кодировка в сообщении должна быть установлена ​​следующим образом:

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

, поскольку charset - это не отдельный заголовок, а опция для Content-type

0 голосов
/ 24 мая 2009

IIRC, MS Office приведены цитаты набора символов "iso-8859-1".

0 голосов
/ 19 мая 2009

Я бы проверил, что данные, получаемые из браузера, верны - выведите дампы кодов 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));
    }
  }

Например, символ ДВОЙНАЯ ЛЕВАЯ Кавычка ( & # x201C; ) - это символ U + 201C.

Прошло много времени с тех пор, как я использовал почтовый API, но метод MimeMessage.html.setText (text, charset) может стоить посмотреть. В документации по setText (String) говорится, что он использует набор символов по умолчанию (вероятно, windows-1252, если вы используете английский / Latin-1 Windows).

0 голосов
/ 19 мая 2009

Почему бы вам не заменить хорошие цитаты обычными простыми кавычками?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...