Pregunta

Nuestra aplicación toma el texto de un formulario web y la envía por correo electrónico a un usuario correspondiente. Sin embargo, cuando alguien copia / pega en el famoso "comillas tipográficas" u otros caracteres especiales de la Palabra, las cosas se ponen peludas.

Los tipos de usuario en

  

dijo “hola” a mí, ¿no es agradable?

Pero cuando aparece el mensaje en Outlook 2003, sale así:

  

dijo hola a meisnt que agradable?

El código para esta era:

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

Después de un poco de investigación, pensé que esto era probablemente un problema de codificación de caracteres y trató de mover las cosas a UTF-8. Por lo tanto, he actualizado el código de esta manera:

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

Esto me puso más cerca, pero no puro:

  

Dijo que un “hello” a MEA-isnÂ't que agradable?

No me puedo imaginar que esto es un problema poco común - lo que me he perdido

¿Fue útil?

Solución

Es la página con el formulario también con UTF-8, o un conjunto de caracteres diferente? Si no se especifica el conjunto de caracteres página web, el formato de los datos que vienen a su guión es una incógnita.


Editar: el juego de caracteres en el mensaje se debe establecer de esta manera:

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

desde el juego de caracteres no es una cabecera separada, sino una opción para el tipo de contenido

Otros consejos

¿Por qué no se cambian las buenas cotizaciones con citas regulares de primera?

Me gustaría comprobar que los datos se reciben desde el navegador es correcta - volcado de los puntos de código Unicode y los compararán con las tablas :

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

Por ejemplo, el símbolo de doble LEFT PRESUPUESTO MARK () es el carácter U + 201C.

Ha pasado mucho tiempo desde que utiliza la API de correo, pero el MimeMessage.html.setText (texto, juego de caracteres) método podría valer la pena un vistazo. La documentación en setText (String) dice que utiliza el conjunto de caracteres por defecto (probablemente ventanas-1252 si está utilizando Inglés / Latin-1 de windows).

IIRC, cotizaciones de MS Office se encuentran juego de caracteres "iso-8859-1".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top