【问题标题】:Problems converting BSTR to char *将 BSTR 转换为 char * 的问题
【发布时间】:2013-01-04 18:38:12
【问题描述】:

我们有一个使用 WinHttp.WinHttpRequest.5.1 调用第三方网络服务的旧 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,但是对于这个 web 服务,看起来我们遇到了一些字符代码转换问题。我们得到的字符串以; "?&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;..."

注意开头多余的?。在调试器中遍历时,我们在bstrResponse 的显示值中看不到它,在b 的显示值中也看不到它,但在@987654332 的显示值中确实看到了它@。

对可能发生的事情有什么想法吗?

已编辑

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

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

【问题讨论】:

  • 它不起作用,因为 BSTR 不是字节长度字符的字符串。详情请咨询this question
  • 您是否认为static_cast 可能不是将任意类型转换为可打印char* 字符串的有效方法? ;)
  • 我理解BSTR是多字节类型,但是这个字符串中的所有字符都是纯ASCII,调用这个函数的代码没有一个可以处理多字节字符。
  • @Jeff 它们不一定是纯 ASCII,根据 XML 标签它们是 UTF-8。我假设您看到的问号是byte order mark
  • @0A0D static_cast 导致调用ConvertBSTRToString

标签: c++ character-encoding bstr


【解决方案1】:

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

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

更新

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

【讨论】:

  • 如果字符串包含 BOM,则为真。
  • 我不明白你的意思。看了你贴的答案,看来我的分析是准确的。
  • 我不反对你。因为这个字符串有一个BOM,所以转换后的第一个字符是'?'。
  • 我需要转换为 7 位 ASCII,即使这意味着去除或转换无法用 7 位 ASCII 表示的字符。 (我还需要说服我的老板,我们应该在这个应用程序中找到比我们正在使用的更好的 XML 解析器。)
  • 是什么让你这么想?所有迹象都表明 UTF-8 是您所需要的。这是 XML 的本机编码。我希望您的解析器能够在 UTF-8 上工作。
【解决方案2】:

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

在去除 BOM 并将高位字符替换为空格后,解析器工作正常。

【讨论】:

  • 您为什么期望从 UTF-16 到 ANSI 的转换会去除 BOM?这是比文本编码更高层次的问题。
  • 几乎可以肯定,您的 XML 解析器反对输入 ANSI 文本而不是 UTF-8。
猜你喜欢
  • 2011-04-08
  • 2010-10-11
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
相关资源
最近更新 更多