علامات الاقتباس الذكية في MimeMessage لا تظهر بشكل صحيح في Outlook

StackOverflow https://stackoverflow.com/questions/883532

سؤال

يأخذ تطبيقنا النص من نموذج ويب ويرسله عبر البريد الإلكتروني إلى المستخدم المناسب.ومع ذلك، عندما يقوم شخص ما بنسخ/لصق "علامات الاقتباس الذكية" سيئة السمعة أو غيرها من الأحرف الخاصة من Word، تصبح الأمور صعبة.

يقوم المستخدم بإدخال

قال "مرحبًا" لي، أليس هذا لطيفًا؟

ولكن عندما تظهر الرسالة في Outlook 2003، تظهر على النحو التالي:

وقال مرحبا إلى 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 أم مجموعة أحرف مختلفة؟إذا لم تحدد مجموعة أحرف صفحة الويب، فإن تنسيق البيانات القادمة إلى البرنامج النصي الخاص بك هو تخمين أي شخص.


يحرر:يجب تعيين مجموعة الأحرف في الرسالة على النحو التالي:

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

نظرًا لأن مجموعة الأحرف ليست رأسًا منفصلاً، ولكنها خيار لنوع المحتوى

نصائح أخرى

لماذا لا تحل محل نقلت لطيفة مع رئيس الوزراء يقتبس العادية؟

سأتحقق من صحة البيانات التي يتم تلقيها من المتصفح - قم بتفريغ نقاط كود Unicode وتحقق منها مقابل الرسوم البيانية:

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

على سبيل المثال، الرمز DOUBLE LEFT QUOTATION MARK () هو الحرف U+201C.

لقد مر وقت طويل منذ أن استخدمت واجهة برمجة تطبيقات البريد، ولكن MimeMessage.html.setText(نص، مجموعة محارف) قد تكون الطريقة تستحق نظرة.الوثائق على مجموعة النص (سلسلة) يقول أنه يستخدم مجموعة الأحرف الافتراضية (من المحتمل أن يكون windows-1252 إذا كنت تستخدم اللغة الإنجليزية/اللاتينية-1 Windows).

وIIRC، تم العثور على الاقتباس MS مكتب characterset "ISO-8859-1".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top