转换BSTR到char *的问题

时间:2013-01-21 16:38:36

标签: c++ character-encoding bstr

我们有一个使用WinHttp.WinHttpRequest.5.1调用第三方Web服务的旧C ++应用程序。

我不会列出调用序列的所有细节,因为我认为这与问题无关,但我们通过调用hr = pIWinHttpRequest->get_ResponseText(&bstrResponse);完成,其中bstrResponse的类型为BSTR

调用代码不适用于BSTR,它适用于标准C / C ++ char *,因此代码将BSTR转换为char *,其中包含:

_bstr_t b(bstrResponse);
const char *c = static_cast<char *>(b);

对于我们使用此代码访问的所有先前的Web服务,这已经奏效。但对于这个新的,它不是。

我们回来的数据应该是XML,但是对于这个网络服务,看起来我们遇到了一些字符代码转换问题。我们生成的字符串以; "?&lt;?xml version="1.0" encoding="utf-8"?&gt;..."

注意开头的额外?。在调试器中浏览时,我们在bstrResponse的显示值中看不到这一点,我们在b的显示值中看不到它,但我们在显示的内容中看到它价值c

关于可能发生的事情的任何想法?

EDITED

我知道BSTR是一个多字节类型,但是该字符串中的所有字符都是纯ASCII,并且调用此函数的代码都不能处理多字节字符。浏览网页时,我经常看到这种特定的机制,但在这种情况下,它不起作用。

我需要将此字符串从BSTR转换为单字节字符数组。即使这意味着剥离无法转换的多字节字符。

2 个答案:

答案 0 :(得分:2)

使用static_cast _bstr_t上的代码转换正确转换为ANSI。编码转换中?的出现表明字符的转换失败。最可能的原因是bstrResponse包含ANSI代码页中不存在的字符。我希望您应该转换为UTF-8而不是ANSI,但当然我没有您拥有的所有信息。

底线是?表示源字符串包含无法在目标字符集中编码的字符。

<强>更新

您的回答进一步证明您应该转换为UTF-8。只有你可以肯定地知道,但你提出的证据与这个结论是一致的。

答案 1 :(得分:0)

原来有两个问题。首先,上面描述的转换过程并没有删除字节顺序标记,这在我看来应该是,而第二个是我们使用的旧C ++ XML解析器在8位ASCII字符上使用choke,而这个web服务正在发送我们在其文本中使用了ASCII'\ xA9'的版权符号。

剥离BOM并用空格替换高位字符,解析器工作正常。