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

C++ 阿拉伯语文本的BSTR到CString转换,c++,visual-c++,unicode,cstring,bstr,C++,Visual C++,Unicode,Cstring,Bstr,我的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(szStartDate

我的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包含垃圾字符,解析失败:01/05/2012 11:50:28ã

是否有在阿拉伯语设置下工作的BSTR到CSTR转换?

是由UTF-16编码的Unicode码点(宽“字符”,16位)组成的字符串:

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

CString
包含垃圾字符的原因是您直接从
\u bstr\u t
检索
char*
。您需要首先将这个宽字符字符串转换为多字节字符串。有很多方法可以做到这一点,其中之一就是使用

这个问题也将帮助您:

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

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

CString
包含垃圾字符的原因是您直接从
\u bstr\u t
检索
char*
。您需要首先将这个宽字符字符串转换为多字节字符串。有很多方法可以做到这一点,其中之一就是使用


这个问题也将帮助您:

尽管MBCS设置为CString,您仍可以尝试使用CString,但它只支持阿拉伯语


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

尽管有MBCS设置,但使用CString仍可以尝试执行此操作,但它只支持阿拉伯语


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

最好的解决方案是停止使用MBCS。最好的解决方案是停止使用MBCS。
typedef WCHAR OLECHAR;
typedef OLECHAR* BSTR;