2010-02-01 49 views
3

我想通过ShellExecute函数启动默认的电子邮件客户端应用程序。如何在“mailto”协议中使用unicode?

即我写这样的东西:

ShellExecute(0,'mailto:[email protected]?subject = example & body = example',...);

如何在主体和主体中编码非US字符?

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

P.S.备注:

  1. 我正在使用ShellExecuteW函数。
  2. 离开主题和身体“照原样”将不起作用(在WinXP上使用Win7和Outlook Express上的Windows Live Mail客户端进行测试)。
  3. 作为URLEncode(UTF8Encode(Subject))编码主题将适用于Windows Live Mail,但不适用于Outlook Express。
  4. URLEncode(UTF8Encode(Body))不适用于两个客户端。

回答

6

的mailto:?[email protected]受试者=例如&体=%E5%85%广告

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

#include "windows.h" 

int main() { 
    ShellExecute(0, TEXT("open"), 
    TEXT("mailto:[email protected]?subject=example&body=%e5%85%ad"), 
    TEXT(""), NULL, SW_SHOWNORMAL); 

    return 0; 
} 

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

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

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

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

+2

好吧,所以简短的回答是:“使用UTF-8格式的%-encoding”(所以我几乎是这样做的)。如果你有垃圾 - 扔掉你的电子邮件客户端:D – Alex 2010-02-01 19:01:32

+1

你可能想看看这个:http://stackoverflow.com/questions/4458939/mailto-href-not-working-as-expected-in-browser/4459102#4459102 – 2010-12-17 05:11:01

2

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

最好的办法是通过阅读注册表来检测3-4个流行的邮件程序并相应地自定义您的命令行。非常不雅,并且设计不完整,但没有别的办法可以做。

+0

那么,我宁愿使用MAPI或其他的东西:D – Alex 2010-02-01 18:59:52