如何在"mailto"协议中使用unicode?

Ale*_*lex 3 mailto unicode winapi

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

即我写这样的东西:

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

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

我不能使用默认的ANSI代码页,因为字符可以是任何东西:汉字,西里尔字母或其他东西.

PS备注:

  1. 我正在使用ShellExecuteW函数.
  2. "按原样"保留主题和正文将无效(使用Win7上的Windows Live Mail客户端和WinXP上的Outlook Express进行测试).
  3. 将主题编码为URLEncode(UTF8Encode(主题))将适用于Windows Live Mail,但不适用于Outlook Express.
  4. URLEncode(UTF8Encode(Body))不适用于两个客户端.

McD*_*ell 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;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,身体是编码为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支持状态,但它可能值得研究.但是,查询部分中的某些字符仍需要进行百分比编码.

  • 好的,所以简短的回答是:"在UTF-8表单上使用%-encoding"(所以我几乎是这样做的).如果你有垃圾 - 扔掉你的电子邮件客户端:D (2认同)