전망에 올바르게 나타나지 않는 모방의 스마트 인용문
-
22-08-2019 - |
문제
우리의 응용 프로그램은 웹 양식에서 텍스트를 가져 와서 이메일을 통해 적절한 사용자에게 보냅니다. 그러나 누군가가 악명 높은 "스마트 인용문"또는 단어의 다른 특수 문자로 복사/페이스트를 할 때는 일이 털이 있습니다.
사용자는
그는 나에게“안녕하세요”라고 말했습니다. 그렇게 좋지 않습니까?
그러나 메시지가 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"문자 세트가 발견됩니다.