变量bstr到std :: string转换的默认编码

时间:2009-12-01 16:58:06

标签: c++ com msxml std

我有一个从MSXML DOM中提取的变体bstr,所以它是UTF-16。我试图找出此转换发生的默认编码:

VARIANT vtNodeValue;
pNode->get_nodeValue(&vtNodeValue);
string strValue = (char*)_bstr_t(vtNodeValue);

从测试开始,我认为默认编码是Windows-1252或Ascii,但我不确定。

顺便说一下,这是我修复的代码块,并将变量转换为wstring,并通过调用WideCharToMultiByte进行多字节编码。

谢谢!

2 个答案:

答案 0 :(得分:10)

operator char*方法调用_com_util::ConvertBSTRToString()The documentation非常无用,但我认为它使用当前的区域设置进行转换。

更新

在内部,_com_util::ConvertBSTRToString()调用WideCharToMultiByte,为所有代码页和默认字符参数传递零。这与传递CP_ACP相同,这意味着使用系统当前的ANSI代码页设置(而不是当前的线程设置)。

如果您想避免丢失数据,可以直接致电WideCharToMultiByte并使用CP_UTF8。您仍然可以将字符串视为以空字符结尾的单字节字符串并使用std::string,您只是不能将字节视为字符。

答案 1 :(得分:0)

std::string本身不指定/包含任何编码。它只是一个字节序列。同样适用于std::wstring,它只是wchar_t s(Win32上的双字节字)序列。

通过_bstr_tchar*转换为wchar_t,您只需获取指向原始数据的指针即可。 operator char*,此数据由宽字符组成,即std::string s,代表UTF-16。

我很惊讶它实际上可以从中构建wstring;你不应该超过第一个零字节(如果你的原始字符串是英文的话,很快就会发生)。

但由于wchar_t_bstr_t的字符串,您应该可以直接从_bstr_t tmp(vtNodeValue); wstring strValue((wchar_t*)tmp, tmp.length()); 构建一个字符串,如下所示:

length

(我不确定wstring;它是字节数还是字符数?)然后,你将有一个WideCharToMultiByte以UTF-16编码可以致电{{1}}。