excel - WinHttpRequest 对象返回 "â??"而不是 "✓"(U+2713)

标签 excel vba winhttp winhttprequest

这个问题在这里已经有了答案:





WinHttpRequest gzip response parsing

(1 个回答)


去年关闭。




我正在使用 Excel 2007 (12.0.4518.1014)
我一直在使用WinHttpRequest在为我托管数据的 Web 服务上执行 API GET 请求的对象。
其他一切正常,它从 Web 服务中获取 JSON 格式的数据并将其放入带有 .ResponseText 的字符串中。属性(property)。
我遇到的问题是,在该字符串中,所有 Unicode 字符都变成了像 â?? 这样的乱码。而不是 (U+2713)。这意味着当我做 MyRange.Value = .ResponseText单元格值变为 â?? .
如果我将 GET 请求设置为请求 Xml 格式,我会得到 �??而不是 我通过在 Chrome 中重复 GET 请求来确认,网络服务正在输出正确的 Unicode 符号,并且 Chrome 能够向我显示 .所以这是 VBA 或 WinHttp 的问题。
Excel 本身能够生成 Unicode 符号,而 VBA 也能够做到 ChrW(10003) .
如何在 GET 请求期间保留 Unicode 符号?是否可以使用 WinHttp 或者我需要更改方法?
编辑:
以下是标准响应期间的 header :

{
  "access-control-allow-headers": "Content-Type",
  "access-control-allow-methods": "GET, POST, PUT, DELETE, OPTIONS",
  "access-control-allow-origin": "*",
  "cache-control": "private",
  "content-encoding": "gzip",
  "content-security-policy": "frame-ancestors 'self', default-src * 'unsafe-inline' 'unsafe-eval' data: blob:;",
  "content-type": "application/json",
  "date": "Wed, 23 Jun 2021 18:08:53 GMT",
  "expect-ct": "max-age=0;",
  "referrer-policy": "strict-origin-when-cross-origin",
  "strict-transport-security": "max-age=31536000; includeSubDomains; preload",
  "vary": "Accept-Encoding",
  "x-content-type-options": "nosniff",
  "x-frame-options": "SAMEORIGIN",
  "x-stackifyid": "V2|80002f92-0000-3100-b63f-84710c7967bb|C61313|CD10436"
}
更新:已解决!
我已经通过@GSerg 的建议和@JoelCoeHoorn 的精彩见解解决了我的问题。自从我的问题结束以来,我将在这里写下它是如何解决的。
WinHTTPRequest 被替换为 XMLHTTP目的。这个对象可以在 VBA 中使用与 WinHTTPRequest 类似的命令,如页面中间的链接所示。但是 XMLHTTP 对象能够毫无问题地返回 Unicode 字符。
要在 VBA 中使用它,您可以使用以下行创建它:
    Dim http As Object
    Set http = CreateObject("Microsoft.XMLHTTP")
然后您就可以使用 .open.setRequestHeader.Send类似于 WinHttpRequest 对象。

最佳答案

我知道与 HTTP 事务相关的五种方式:
响应有一个 header ,其中包含使用的特定编码。如果选择的编码不能显示文本中使用的所有字符点,这就是你得到的。
如果直接设置响应的文本并且未映射到 header 中指定的编码,这也是您得到的,因此编码表明文本应该与它的不同。
由于历史原因,有些编码依赖于系统,其中编码的上部区域取决于本地安装的语言包/设置。因此,如果 header 选择系统特定的编码并且文本设置在系统上,即使两端使用相同的编码,该上部区域的解释与客户端不同,您也可以看到这种效果。
当字节顺序标记被错误地使用、忽略或解释为文本时,可能发生这种情况的第四种方式是使用 UTF-8。
最后,(这是最有可能适合您的情况的这些选项)当在一个地方使用了另一个不支持的编码时,可能会发生这种情况。 VBA 早于 unicode 的广泛采用,并且没有良好的 unicode 支持。尤其是旧版本的 VBA,比如您可能会在长期不受支持的 Excel 2007 中遇到这种情况。
这些问题都倾向于仅针对 unicode 字符表现出来,而只留下简单的拉丁字符,因为许多编码都以完全相同的方式处理简单的拉丁字符。

关于excel - WinHttpRequest 对象返回 "â??"而不是 "✓"(U+2713),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68104951/

相关文章:

excel - 将公式粘贴到单元格时如何避免Excel VBA中的@字符

excel - 如何在忽略空的变体中找出使用范围的大小

arrays - 当数字重复时,如何找到数组中第 n 个最小的数字?

vba - 如何使用 VBA 在 Sharepoint 站点中打开文件

vba - 删除字符右侧所有内容的代码会出错

c++ - HttpAddUrl 因 ERROR_SHARING_VIOLATION (32L) 而失败

c++ - 如何验证自签名证书?

c++ - WinHTTP 错误 URL 无效

excel - 如何使用 vba 命令删除某个值?

vba - VBA 中的评估()