c# - 日语电子邮件主题编码

标签 c# email unicode encoding

显然,对日语电子邮件进行编码有点具有挑战性,我正在慢慢发现自己。如果有任何专家(即使是那些经验有限的人也可以),我能否提供一些关于如何做、如何测试以及如何验证的指南?

请记住,我从未涉足过日本附近的任何地方,只是我正在开发的产品在那里以及其他地方使用。

目前我所知道的(我认为)如下:
- 日语电子邮件应使用 ISO-2022-JP、日语 JIS 代码页 50220 或可能的 SHIFT_JIS 代码页 932 进行编码
- 电子邮件传输编码应设置为纯文本的 Base64 和 Html 的 7Bit
- 电子邮件主题应单独编码以“=?ISO-2022-JP?B?”开头(不知道这是什么意思)。我试过用

编码主题
"=?ISO-2022-JP?B?" + Convert.ToBase64String(Encoding.Unicode.GetBytes(subject))

基本上按预期给出编码字符串,但它不会在电子邮件程序中显示为任何日文文本
- 我已经在 Outlook 2003、Outlook Express 和 GMail 中测试过

任何帮助将不胜感激


好的,所以要发布一个简短的更新,感谢两个有用的答案,我已经设法获得正确的格式和编码。现在,Outlook 给出了类似于正确主题的内容:
=?iso-2022-jp?B?6 日文测试ニ各うの视点で语っテもらった。6相当の防水?=

但是,在 Outlook Express 中,完全相同的电子邮件给出的主题如下:
=?iso-2022-jp?B?6 日文测试縺ォ蜷・・・陨也せ縺ァ隐槭▲縺﹧ゅi縺」縺溘・6逶ク蠖薙・髦イ豌エ?=

此外,在Outlook Express的收件箱 View 中查看时,邮件主题更加诡异,像这样:
=?iso-2022-jp?B?6日语测试?????????????????? 6????????=

Gmail 的工作方式似乎与 Outlook 类似,看起来是正确的。

我只是无法理解这个问题。

最佳答案

我处理日语编码已有将近 20 年的时间,因此我可以理解您的困难。我工作过的网站每天都会向日本客户发送数百封电子邮件,因此我可以与您分享对我们有用的内容。

  • 首先,不要使用 Shift-JIS。我个人收到了大量日文电子邮件,但几乎从未使用 Shift-JIS 编码。我认为旧版(大约 Win 98?)的 Outlook Express 使用 Shift-JIS 对外发邮件进行了编码,但现在您根本看不到它。

  • 如您所知,您至少需要使用 ISO-2022-JP 作为邮件 header 中任何内容的编码。这包括主题、收件人行和抄送行。 UTF-8 在大多数情况下也适用,它不适用于 Yahoo Japan 邮件,而且正如您可以想象的那样,许多日本用户使用 Yahoo Japan 邮件。

  • 您可以在电子邮件的正文中使用 UTF-8,但建议您对 UTF-8 编码的日文文本进行 base64 编码并将其放在正文中,而不是原始的 UTF-8 文本。然而,在实践中,我相信原始的 UTF-8 文本现在可以很好地用于电子邮件正文。

  • 正如我上面提到的,您至少需要在 Outlook (Exchange)、Outlook Express (IMAP/POP3) 和 Yahoo Japan Web 邮件上进行测试。雅虎日本是最棘手的,因为我相信他们使用 EUC 对其网页进行编码,因此您需要遵循正确的电子邮件标准,否则它们将无法正常工作(ISO-2022-JP 是发送日语电子邮件的标准).

  • 此外,您的主题行每行不应超过 75 个字符。也就是说,在 ISO-2022-JP 和 base64 编码后 有 75 个字符,而不是转换前的 75 个字符。如果超过 75 个字符,则需要将编码的主题分成多行,以“=?iso-2022-jp?B?”开头每行以“?=”结尾。如果您不这样做,您的主题可能会被截断(取决于电子邮件阅读器,以及您的主题文本的内容)。根据 RFC 2047:

“‘encoded-word’的长度不得超过 75 个字符,包括‘charset’、‘encoding’、‘encoded-text’和定界符。如果希望编码的文本多于适合75 个字符的‘encoded-word’,可以使用多个‘encoded-word’(由 CRLF SPACE 分隔)。”

  • 下面是一些用于对主题进行编码的示例 PHP 代码:

 // Convert Japanese subject to ISO-2022-JP (JIS is essentially ISO-2022-JP)

 $subject = mb_convert_encoding ($subject, "JIS", "SJIS");

 // Now, base64 encode the subject

 $subject = base64_encode ($subject);

 // Add the encoding markers to the subject

 $subject = "=?iso-2022-jp?B?" . $subject . "?=";

 // Now, $subject can be placed as-is into the raw mail header.
  • 有关如何对电子邮件 header 进行编码的完整说明,请参阅 RFC 2047。

关于c# - 日语电子邮件主题编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/419977/

相关文章:

c# - 动态 LINQ - 有 .NET 4 版本吗?

C# 使用不同的 "processors"蝇量模式处理同一对象?

php - 如何从 codeigniter 运行参数是动态的 cron 作业

string - 由于字符串中的 unicode 字符导致应用程序崩溃

c# - 如何使用 ImageLocation 将图像放入我的图片框中?

c# - 如何在 WPF 中动态创建矩形?

使用 utf-8 编码的 php 邮件在 Microsoft 邮件客户端中显示不正确

c++ - UTF-16LE 半角和全角?意义?

javascript - 在javascript中将文本转换为Unicode