8

我有一个从 MSXML DOM 中提取的变体 bstr,所以它是 UTF-16。我试图弄清楚这种转换会发生什么默认编码:

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

通过测试,我相信默认编码是 Windows-1252 或 Ascii,但不确定。

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

谢谢!

4

2 回答 2

10

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

更新:

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

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

于 2009-12-01T17:29:14.317 回答
0

std::string本身不指定/包含任何编码。它只是一个字节序列。也是std::wstring如此,它只是一个wchar_ts 序列(Win32 上的双字节字)。

通过其运算符 char*转换_bstr_t为 a ,您将简单地获得指向原始数据的指针。根据 MSDN ,此数据由表示 UTF-16的宽字符组成,即s。char*wchar_t

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

但既然wstring是 的字符串wchar_t,您应该能够直接从 构造一个_bstr_t,如下所示:

_bstr_t tmp(vtNodeValue);
wstring strValue((wchar_t*)tmp, tmp.length());

(我不确定length;是字节数还是字符数?)然后,您将拥有一个wstring以 UTF-16 编码的,您可以在其上调用WideCharToMultiByte.

于 2009-12-01T17:22:58.010 回答