3

我想通过 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(Subject)) 将适用于 Windows Live Mail,但不适用于 Outlook Express。
  4. URLEncode(UTF8Encode(Body)) 不适用于两个客户端。
4

2 回答 2

6

example@example.com?subject=example&body=%e5%85%ad

简短的回答是否定的。字符必须按照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 ( ) 的 CJK 字符 U+516D (六E5 85 AD)。这适用于 Mozilla Thunderbird(如果没有,您可能需要安装其他字体)。

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

注意:URLEncode函数一般是指 HTMLapplication/x-www-form-urlencoded编码。这可能会导致空格字符被加号字符替换。

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

于 2010-02-01T16:49:27.237 回答
2

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

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

于 2010-02-01T16:38:18.413 回答