如何在“mailto”协议中使用unicode?

时间:2010-02-01 14:34:51

标签: winapi unicode mailto

我想通过ShellExecute函数启动默认的电子邮件客户端应用程序。

即。我写的是这样的:

ShellExecute(0,'mailto:example@example.com?subject = example& body = example',...);

如何在主题和正文中编码非美国字符?

我无法使用默认的ANSI代码页,因为字符可以是任何字符:中文字符,西里尔字母或其他内容。

P.S。注意:

  1. 我正在使用ShellExecuteW功能。
  2. “按原样”保留主题和正文不起作用(在Win7上使用Windows Live Mail客户端和在WinXP上使用Outlook Express进行测试)。
  3. 将主题编码为URLEncode(UTF8Encode(主题))将适用于Windows Live Mail,但不适用于Outlook Express。
  4. URLEncode(UTF8Encode(Body))不适用于两个客户端。

2 个答案:

答案 0 :(得分:6)

  

的mailto:?example@example.com受试者=示例&安培;主体=%E5%85%广告

简短的回答是。字符必须按RFC 3986及其前身定义的百分比编码。 RFC 2368定义了mailto URI的结构。

#include "windows.h"

int main() {
  ShellExecute(0, TEXT("open"),
    TEXT("mailto:example@example.com?subject=example&body=%e5%85%ad"),
    TEXT(""), NULL, SW_SHOWNORMAL);

  return 0;
}

在这种情况下,身体是编码为UTF-8(E5 85 AD)的CJK字符U + 516D(六)。这适用于Mozilla Thunderbird(如果没有,可能需要安装其他字体)。

其余部分取决于您的用户代理(邮件客户端)如何解释URI。 RFC 3986要求UTF-8,但先前的规范没有。如果用户代理在RFC 3986之前更新,尚未更新或与以前的实现保持向后兼容性,则用户代理可能无法正确解释数据。

注意:URLEncode函数通常表示HTML application/x-www-form-urlencoded编码。这可能会导致空格字符被加号字符替换。

注意2:我目前不了解Windows shell中IRI支持的状态,但它可能值得研究。但是,查询部分中的某些字符仍需要进行百分比编码。

答案 1 :(得分:2)

命令行的解释取决于已启动的程序。根据已安装的电子邮件客户端的性质,您可能会或可能不会获得Unicode支持(以一种或另一种不同的形式或形式)。所以没有单一的食谱。其中一些可能使用ANSI命令行(因为为什么不?),其中一些可能会尊重URLEncoded字符等。

最好的办法是通过阅读注册表来检测3-4个热门邮件,并相应地自定义命令行。非常不优雅,设计不完整,但你无能为力。