Domanda

La nostra applicazione prende il testo da un web form e invia tramite e-mail a un utente appropriato.Tuttavia, quando qualcuno copia/incolla nel famigerato "inglesi" o altri caratteri speciali da Word, le cose si fanno peloso.

L'utente digita

ha detto “ciao” per me—non è fantastico?

Ma quando il messaggio viene visualizzato in Outlook 2003, viene fuori come questo:

ha detto ciao a meisnt che bello?

Il codice per questo è stato:

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

Dopo un po ' di ricerche, ho pensato che questo era probabilmente un problema di codifica dei caratteri e ha tentato di spostare le cose a UTF-8.Così, ho aggiornato il codice protettori così:

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

Questo mi ha fatto più vicino, ma nessun sigaro:

egli disse: “hello” per me—isna bella?

Non riesco a immaginare questo è un problema insolito--che cosa mi sono perso?

È stato utile?

Soluzione

È la pagina con il modulo, inoltre, utilizzando la codifica UTF-8 o un charset diverso?Se non si specifica la pagina web di set di caratteri, il formato di dati a venire al tuo script è indovinare di nessuno.


Edit:il set di caratteri nel messaggio deve essere impostato come questo:

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

dal set di caratteri non è un intestazione separata, ma di un'opzione per il tipo di Contenuto

Altri suggerimenti

Perché non sostituire il bello preventivi con regolare prime citazioni?

Vorrei verificare che i dati ricevuti dal browser è corretto - dump punti di codice Unicode e di controllo contro l' grafici:

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

Per esempio, il simbolo di un DOPPIO SEGNO di VIRGOLETTE () è il carattere U+201C.

È stato un lungo tempo da quando ho utilizzato l'API di posta, ma il MimeMessage.html.setText(testo, charset) metodo potrebbe essere la pena dare un'occhiata.La documentazione setText(String) dice che utilizza il set di caratteri di default (probabilmente windows-1252 se si sta utilizzando la lingua inglese/latina-1 di Windows).

IIRC, MS Office quotazioni sono trovato il set di caratteri iso-8859-1".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top