我们有一个使用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,但是对于这个网络服务,看起来我们遇到了一些字符代码转换问题。我们生成的字符串以; "?<?xml version="1.0" encoding="utf-8"?>..."
注意开头的额外?
。在调试器中浏览时,我们在bstrResponse
的显示值中看不到这一点,我们在b
的显示值中看不到它,但我们在显示的内容中看到它价值c
。
关于可能发生的事情的任何想法?
EDITED
我知道BSTR是一个多字节类型,但是该字符串中的所有字符都是纯ASCII,并且调用此函数的代码都不能处理多字节字符。浏览网页时,我经常看到这种特定的机制,但在这种情况下,它不起作用。
我需要将此字符串从BSTR转换为单字节字符数组。即使这意味着剥离无法转换的多字节字符。
答案 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并用空格替换高位字符,解析器工作正常。