代码之家  ›  专栏  ›  技术社区  ›  Pau

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

  •  8
  • Pau  · 技术社区  · 16 年前

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

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

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

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

    谢谢!

    2 回复  |  直到 9 年前
        1
  •  10
  •   Tim Sylvester    9 年前

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

    更新:

    在内部, _ COM实用程序::convertbsertostring() 电话 WideCharToMultiByte ,为所有代码页和默认字符参数传递零。这和传球一样 CP_ACP ,这意味着使用系统的当前ANSI代码页设置(而不是当前线程设置)。

    如果你想避免丢失数据,你应该打电话给 宽图表多字节 直接使用 CP_UTF8 . 您仍然可以将字符串视为以空结尾的单字节字符串,并使用 std::string ,您不能将字节视为字符。

        2
  •  0
  •   Thomas    16 年前

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

    通过转换 _bstr_t 到A char* 通过它 operator char* ,您只需获得指向原始数据的指针。 According to MSDN ,此数据由宽字符组成,即, 瓦查特 S,代表UTF-16。

    我很惊讶的是,它实际上可以构建一个 STD::字符串 从这里开始,您不应该超过第一个零字节(如果您的原始字符串是英语的话,很快就会出现)。

    但自从 wstring 是一系列 瓦查特 ,您应该能够直接从 贝斯特里特 如下:

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

    (我不确定 length ;是字节数还是字符数?)那么,你会有一个 W线 它是用UTF-16编码的,你可以调用它 WideCharToMultiByte .

    推荐文章