【问题标题】:Accessing binary data from Javascript, Ajax, IE: can responseBody be read from Javascript (not VB)?从 Javascript、Ajax、IE 访问二进制数据:可以从 Javascript(不是 VB)读取 responseBody 吗?
【发布时间】:2011-04-11 21:45:12
【问题描述】:

首先,我知道这个问题:

特别是其中的最佳答案,http://emilsblog.lerch.org/2009/07/javascript-hacks-using-xhr-to-load.html

因此,使用 Firefox(以及实际上似乎也可以工作的更高版本的 Chrome;不了解 Opera)从 Javascript 访问二进制数据。到目前为止,一切都很好。 但我仍然希望找到一种在不使用 VB 的情况下使用现代 IE(最好是 IE 6,但至少 IE 7+)访问二进制数据的方法。 有人提到 XHR.messageBody 不起作用(如果它包含零字节),但我想知道这是否可能已经用较新的版本解决了;或者是否有允许简单二进制数据访问的替代设置。

对我来说,具体用例是访问使用二进制数据传输格式(包括在 UTF-8 编码中不合法的字节组合)编码的 Web 服务返回的数据。

【问题讨论】:

    标签: javascript ajax internet-explorer xmlhttprequest binary-data


    【解决方案1】:

    【讨论】:

    【解决方案2】:

    好的,我找到了一些有趣的线索,虽然还不是完全好的解决方案。

    我尝试过的一件显而易见的事情是使用编码。有两件显而易见的事情确实应该起作用:

    • Latin-1(又名 ISO-8859-1):它是单字节编码,与 Unicode 一对一映射。所以理论上声明“text/plain; charset=ISO-8859-1”的内容类型并获得每字节字符就足够了。唉,由于浏览器的愚蠢逻辑(以及 HTML 5 的更愚蠢的要求!),发生了一些转码,它以奇怪的方式改变了高控制字符范围(代码 128 - 159)。显然这是由于强制假设编码确实是 Windows-1252(为什么?出于一些愚蠢的原因......但它就是这样)
    • UCS-2 是早于 UTF-17 的固定长度 2 字节编码;并简单地将 16 位字符代码拆分为 2 个字节。唉,浏览器似乎不支持它。
    • UTF-16 理论上可能有效,但存在保留的代理对字符 (0xD800 - 0xDFFF) 的问题。如果包含对这些字符进行编码的字节对,则会发生损坏。

    但是:Latin-1 的转换似乎是可逆的,如果是这样,我敢打赌我毕竟可以使用它。所有突变都是从 1 字节 (0x00 - 0xFF) 到大于字节的值,至少对于 Firefox 没有模糊映射。如果这适用于其他浏览器,则可以将值映射回来并消除自动转码的不良影响。然后这将适用于多种浏览器,包括 IE(需要注意的是需要一些特殊的东西来处理空值)。

    最后,一些有用的数据类型转换链接是:

    【讨论】:

      【解决方案3】:

      您可以使用 JScript“VBArray”对象在 IE 中获取这些字节(不使用 VBScript):

      var data = new VBArray(xhr.responseBody).toArray();

      【讨论】:

      • 不,我认为这行不通。以我的经验,执行此行时出现异常;它抱怨 responseBody 不是 VBArray。您链接到的 VBArray 文档说 safeArray 参数必须在传递给 VBArray 构造函数之前获得 VBArray 值。这只能通过从现有 ActiveX 或其他对象中检索值来完成。 但是 responseBody msdn.microsoft.com/en-us/library/ms534368(VS.85).aspx 的文档并未表明它是一个 safeArray。
      【解决方案4】:

      我想答案是简单的“不”,根据这篇文章:how do I access XHR responseBody (for binary data) from Javascript in IE?

      (或:“使用 VBScript 来帮助”)

      【讨论】:

        猜你喜欢
        • 2010-12-27
        • 2011-02-18
        • 1970-01-01
        • 1970-01-01
        • 2012-10-22
        • 1970-01-01
        • 2015-12-14
        • 2012-07-02
        • 2012-04-03
        相关资源
        最近更新 更多