1

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

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

调用代码不适用于 BSTR,它适用于标准 C/C++ char *,因此代码将 BSTR 转换为 a char *

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

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

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

?注意开头的额外内容。在调试器中遍历此内容时,我们在的显示值bstrResponse中看不到它,在 的显示值中b也看不到它,但在 的显示值中确实看到了它c

关于可能发生什么的任何想法?

已编辑

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

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

4

2 回答 2

2

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

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

更新

您的回答进一步证明您应该转换为 UTF-8。只有你能确定,但​​你提供的证据与这个结论是一致的。

于 2013-01-21T17:49:10.320 回答
0

原来有两个问题。首先,上面描述的转换过程没有去掉字节顺序标记,在我看来它应该这样做,其次,我们使用的旧 C++ XML 解析器在 8 位 ASCII 字符上阻塞,并且这个 web 服务正在发送我们在他们的文本中使用版权符号,ASCII '\xA9'。

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

于 2013-01-21T17:55:11.420 回答