2

我正在开发一个程序,通过 windows-mobile MAPI 处理传入的电子邮件和短信。代码基本上是这样的:

   ulBodyProp = PR_BODY_A;
   hr = piMessage->OpenProperty(ulBodyProp, NULL, STGM_READ, 0, (LPUNKNOWN*)&piStream);

   if (hr == S_OK)
   {
      // ... get body size in bytes ...
      STATSTG statstg;
      piStream->Stat(&statstg, 0);
      ULONG cbBody = statstg.cbSize.LowPart;

      // ... allocate memory for the buffer ...
      BYTE* pszBodyInBytes = NULL;
      boost::scoped_array<BYTE> szBodyInBytesPtr(pszBodyInBytes = new BYTE[cbBody+2]);

      // ... read body into the pszBodyInBytes ...      
   }

那行得通,我有一个消息正文。问题是这个主体是多字节编码的,我需要返回一个 Unicode 字符串。我想,我必须使用 ::MultiByteToWideChar() 函数,但我怎么能猜到,我应该应用什么代码页?使用 CP_UTF8 是幼稚的,因为它可能根本不在 UTF8 中。使用 CP_ACP 有时会起作用,但有时不会。所以,我的问题是:如何检索有关消息代码页的信息。MAPI 是否为它提供任何功能?或者除了MultiByteToWideChar()之外,还有其他方法可以解码多字节字符串吗?

谢谢!

4

2 回答 2

0

不了解移动设备,但 PR_BODY_W 可用吗?你也有 PR_RTF_COMPRESSED 属性吗?它包含 RTF 标头中的代码页。

Dmitry Streblechenko (MVP) http://www.dimastr.com/ OutlookSpy - Outlook、CDO 和 MAPI 开发工具

于 2010-03-22T21:20:59.313 回答
0

看看 Stephen Griffin 撰写的这篇关于阅读 RTF 流的文章。它解释了如何使用HrTextFromCompressedRTFStreamEx. 它按斯蒂芬的“宣传”工作,并且在更改代码页时确实存在一些问题。

以我的经验,这类问题往往出现在本地文本经常穿插英文文本的地区。我们已经在亚太地区看到了这一点。

于 2010-03-26T09:55:43.017 回答