문제

우리의 응용 프로그램은 웹 양식에서 텍스트를 가져 와서 이메일을 통해 적절한 사용자에게 보냅니다. 그러나 누군가가 악명 높은 "스마트 인용문"또는 단어의 다른 특수 문자로 복사/페이스트를 할 때는 일이 털이 있습니다.

사용자는

그는 나에게“안녕하세요”라고 말했습니다. 그렇게 좋지 않습니까?

그러나 메시지가 2003 년 Outlook에 나타나면 다음과 같이 나옵니다.

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

이것은 나를 더 가까워졌지만 시가는 없습니다.

그는 나에게“안녕하세요”라고 말했습니다. 그다지 좋지 않습니까?

이것이 드문 문제라고 상상할 수 없습니다. 내가 놓친 것은 무엇입니까?

도움이 되었습니까?

해결책

양식이있는 페이지가 UTF-8을 사용하거나 다른 숯이 있습니까? 웹 페이지 charset을 지정하지 않으면 스크립트에 나오는 데이터 형식은 누구나 추측합니다.


편집 : 메시지의 숯불은 다음과 같이 설정해야합니다.

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

Charset은 별도의 헤더가 아니라 콘텐츠 유형의 옵션입니다.

다른 팁

좋은 따옴표를 일반 프라임 따옴표로 바꾸지 않겠습니까?

브라우저에서 수신 된 데이터가 정확한지 확인합니다. 유니 코드 코드 포인트를 버리고 차트:

  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.settext (텍스트, 숯불) 방법은 볼만한 가치가있을 수 있습니다. 문서 setText (문자열) 기본 문자 세트를 사용한다고 말합니다 (아마도 영어/라틴 -1 Windows를 사용하는 경우 Windows-1252).

IIRC, MS Office 따옴표는 "ISO-8859-1"문자 세트가 발견됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top