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

8 c++ com msxml std

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

VARIANT vtNodeValue;
pNode->get_nodeValue(&vtNodeValue);
string strValue = (char*)_bstr_t(vtNodeValue);
Run Code Online (Sandbox Code Playgroud)

从测试来看,我认为默认编码是Windows-1252或Ascii,但我不确定.

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

谢谢!

Tim*_*ter 10

operator char*方法调用_com_util::ConvertBSTRToString(). 该文档非常无用,但我认为它使用当前的语言环境设置来进行转换.

更新:

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

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

  • 谢谢!!!美国Windows上的默认代码页是1252,这与我观察到的一致.这可以在具有此调用的任何机器上确定:int nCodePage = GetACP(); (2认同)