Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 变量bstr到std::字符串转换的默认编码_C++_Com_Msxml_Std - Fatal编程技术网

C++ 变量bstr到std::字符串转换的默认编码

C++ 变量bstr到std::字符串转换的默认编码,c++,com,msxml,std,C++,Com,Msxml,Std,我有一个从MSXMLDOM中提取的变体bstr,所以它在UTF-16中。我正在尝试找出此转换中出现的默认编码: VARIANT vtNodeValue; pNode->get_nodeValue(&vtNodeValue); string strValue = (char*)_bstr_t(vtNodeValue); 通过测试,我相信默认编码是Windows-1252或Ascii,但我不确定 顺便说一句,这是我正在修复的代码块,将变量转换为wstring,并通过调用WideCha

我有一个从MSXMLDOM中提取的变体bstr,所以它在UTF-16中。我正在尝试找出此转换中出现的默认编码:

VARIANT vtNodeValue;
pNode->get_nodeValue(&vtNodeValue);
string strValue = (char*)_bstr_t(vtNodeValue);
通过测试,我相信默认编码是Windows-1252或Ascii,但我不确定

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


谢谢

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

通过its将
\u bstr\u t
转换为
字符*
,您只需获得指向原始数据的指针即可,该数据由宽字符组成,即表示UTF-16的
wchar\u t
s

我感到惊讶的是,它实际上可以从中构造
std::string
;您不应该超过第一个零字节(如果原始字符串是英语,则很快就会出现)

但是由于
wstring
是一个
wchar\u t
字符串,您应该能够直接从
\u bstr\u t
构建一个字符串,如下所示:

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

(我不确定
length
;是字节数还是字符数?)然后,您将拥有一个以UTF-16编码的
wstring
,您可以在其上调用
WideCharToMultiByte
操作符char*
方法调用
\u com\u util::convertbstrotstring()
。这是毫无帮助的,但我假设它使用当前的语言环境设置来进行转换

更新:

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


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

这不对,它不是真正的强制转换,
bstr\u t
定义了一个
运算符char*
,它在内部进行转换。我知道。“演员”这个词不合适吗?也许“转换运算符”更好。我将更改它。这是错误的:将
\u bstr\u t
强制转换为
char*
调用
\u com\u util::convertbstrotstring
函数将字符串转换为基于字节的编码。我想您可以将其称为强制转换,但是你肯定不仅仅得到一个指向宽字符数据的指针。@Thomas我怀疑该语句的目的是表明你不需要取消分配结果。这句话没有说,只是暗示实际上有两个内部缓冲区。(考虑到他们说的是“指向”内部缓冲区的指针,实际上相当混乱。)根据您使用的运算符,您会得到不同的指针值,而不仅仅是指向同一地址的不同类型的指针。有宽缓冲区和窄缓冲区的事实进一步表明,
bstr\t
必须进行内部编码转换。谢谢!!!美国Windows上的默认代码页是1252,这与我观察到的一致。这可以通过以下调用在任何机器上确定:int nCodePage=GetACP();