显然,对日语电子邮件进行编码有点具有挑战性,我正在慢慢发现自己。如果有任何专家(即使是那些经验有限的人也可以),我能否提供一些关于如何做、如何测试以及如何验证的指南?
请记住,我从未涉足过日本附近的任何地方,只是我正在开发的产品在那里以及其他地方使用。
目前我所知道的(我认为)如下:
- 日语电子邮件应使用 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 分隔)。”
// 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.
关于c# - 日语电子邮件主题编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/419977/
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我正在使用ruby1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功
查看Ruby代码,它具有以下proc_arity:staticVALUEproc_arity(VALUEself){intarity=rb_proc_arity(self);returnINT2FIX(arity);}更多的是C编码风格问题,但为什么staticVALUE在单独的一行而不是像这样的:staticVALUEproc_arity(VALUEself) 最佳答案 它来自UNIX世界,因为它有助于轻松grep函数的定义:$grep-n'^proc_arity'*.c或使用vim:/^proc_arity
我创建了一个由于“在运行时执行的单例元类定义”而无法编码的对象(这段代码的描述是否正确?)。这是通过以下代码执行的:#defineclassXthatmyusesingletonclassmetaprogrammingfeatures#throughcallofmethod:break_marshalling!classXdefbreak_marshalling!meta_class=class我该怎么做才能使对象编码正确?是否可以从对象instance_of_x的classX中“移除”单例组件?我真的需要一个建议,因为我们的一些对象需要通过Marshal.dump序列化机制进行缓存。
我想验证一个电子邮件地址是否是PayPal用户。是否有API调用来执行此操作?是否有执行此操作的ruby库?谢谢 最佳答案 GetVerifiedStatus来自PayPal'sAdaptiveAccounts平台会为您做这件事。PayPal没有任何codesamples或SDKs用于Ruby中的自适应帐户,但我确实找到了编写codeforGetVerifiedStatusinRuby的人.您需要更改该代码以检查他们拥有的帐户类型的唯一更改是更改if@xml['accountStatus']!=nilaccount_status
我想知道我应该如何着手这个项目。我需要每周向人们发送一次电子邮件。但是,这必须在每周的特定时间自动生成并发送。编码有多难?我需要知道是否有任何书籍可以提供帮助,或者你们中的任何人是否可以指导我。它必须使用rubyonrails进行编程。因此有一个网络服务和数据库集成。干杯 最佳答案 为什么这么复杂?您只需安排工作。您可以使用Delayed::Job例如。Delayed::Job让您可以使用run_at符号在特定时间安排作业,如下所示:Delayed::Job.enqueue(SendEmailJob.new(...),:run_