2012-05-23 49 views
1

我的VC++(VS2008)项目使用多字节字符集。BSTR转换为CString的CString

我有下面的代码日期字符串转换为的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:28A

是否有一个BSTR CString转换工作在阿拉伯语设置?

+2

远离最好的解决方案是停止使用MBCS。 –

回答

1

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

typedef WCHAR OLECHAR; 
typedef OLECHAR* BSTR; 

这意味着特殊字符,如 'م' 由单WCHAR表示。在多字节字符串中(C风格char*std::string)是由更多字符表示的特殊字符(因此称为“多字节”)。

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

这个问题也将帮助你:How do you properly use WideCharToMultiByte

0

你正在尝试做的CString是可能的,尽管MBCS设置,但它只能支持阿拉伯语。

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