BSTR 到 CString 的阿拉伯语文本转换

BSTR to CString conversion for Arabic text

本文关键字:文本 转换 阿拉伯语 CString BSTR      更新时间:2023-10-16

My VC++ (VS2008( 项目使用多字节字符集。

我有以下代码将日期字符串转换为 COLEDATETIME

_bstr_t bstr_tDate = bstrDate; //bstrDate is populated by a COM function
const CString szStartDateTime = bstr_tDate.operator const char *();
bool bParseOK = oleDateTime.ParseDateTime(szStartDateTime);
此代码在所有区域设置中

都运行良好,但在阿拉伯语区域设置中失败,其中输入日期为以下格式:21/05/2012 11:50:31م

转换后,CString 包含垃圾字符,解析失败: 2012-01-05 11:50:28

是否有适用于阿拉伯语设置的 BSTR 到 CString 转换?

BSTR 是由 UTF-16 编码的 Unicode 代码点(宽"字符",16 位(组成的字符串:

typedef WCHAR OLECHAR;
typedef OLECHAR* BSTR;

这意味着像"م"这样的特殊字符由单个WCHAR表示。在多字节字符串(C 样式char*std::string(中,这些特殊字符由更多字符表示(因此称为"多字节"(。

您的CString包含垃圾字符的原因是因为您直接从_bstr_t检索char*。您需要先将此宽字符字符串转换为多字节字符串。还有更多方法可以做到这一点,其中之一是使用WideCharToMultiByte函数。

这个问题也将帮助您:如何正确使用WideCharToMultiByte

尽管有 MBCS 设置,但您可以使用 CString 尝试执行的操作,但它仅支持阿拉伯语。

开始支持所有 Unicode 可能要容易得多。如果您按照 utf8everywhere.org 的 Windows 部分中的说明进行操作,则可以在不对现有代码造成太大损害的情况下完成此操作(您可以保留 std::string 和 char*(。