Pergunta

A nossa aplicação leva o texto de um formulário web e envia-lo via e-mail para um usuário apropriado. No entanto, quando alguém copiar / pastas nas infames "aspas inteligentes" ou outros caracteres especiais de Word, as coisas cabeludas.

O usuário digita

ele disse “Olá” para mim-não que bom?

Mas quando a mensagem aparece no Outlook 2003, ele sai como esta:

Ele disse Olá para meisnt legal?

O código para isso foi:

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

Depois de um pouco de pesquisa, eu percebi que esta foi provavelmente uma questão de codificação de caracteres e tentou mudar as coisas para UTF-8. Então, eu atualizei o código assim:

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

Esta me chegou mais perto, mas nenhum charuto:

Ele disse que um “hello” para MEA-isnÂ't legal?

Eu não posso imaginar que este é um problema incomum - o que eu perdi

Foi útil?

Solução

É a página com o formulário também usando UTF-8, ou um conjunto de caracteres diferente? Se você não especificar o charset página, o formato dos dados que chegam ao seu roteiro é uma incógnita.


Edit: o conjunto de caracteres na mensagem deve ser definido assim:

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

desde charset não é um cabeçalho separado, mas uma opção para Content-type

Outras dicas

Por que você não substituir os agradáveis ??citações com citações principais regulares?

Gostaria de verificar que os dados recebidos do navegador está correta - despejar os pontos de código Unicode e verificá-los contra o gráficos :

  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 exemplo, o símbolo de duplo ESQUERDA aspas () é o caráter U + 201C.

Tem sido um longo tempo desde que eu usei a API mail, mas o MimeMessage.html.setText (texto, charset) método pode valer a pena um olhar. A documentação sobre setText (string) diz que usa o conjunto de caracteres padrão (provavelmente windows-1252 se você estiver usando Inglês / Latin-1 Windows).

characterset IIRC, citações do MS Office são encontrados "iso-8859-1".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top