从Javascript、Ajax、IE中访问二进制数据:能否从Javascript(而非VB)读取responseBody?

15

首先,我知道这个问题:

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

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

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

4个回答

4

这大概只能在IE上运行?至少在IE上比其他方法更干净,因此是一种改进。 - StaxMan
它可以在其他较新的浏览器中正常工作:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/TypedArray#Browser_compatibility - Damien

3

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

我尝试过的一个明显的事情是调整编码。有两件明显的事情真的应该管用:

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

然而:似乎Latin-1的转换是可逆的,如果是这样,我打赌我最终可以利用它。所有变异都来自1个字节(0x00 - 0xFF)到大于字节值,并且至少对于Firefox而言没有模糊映射。如果其他浏览器也是如此,那么就可以将值映射回来并消除自动转码的不良影响。然后,这将适用于多个浏览器,包括IE(需要特殊处理空值的警告)。

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


2
你可以使用JScript的"VBArray"对象来获取这些字节(在不使用VBScript的情况下): var data = new VBArray(xhr.responseBody).toArray();

1
不,我认为这不起作用。根据我的经验在执行此行时会出现异常;它抱怨responseBody不是VBArray。你提供的VBArray文档说:“必须从现有的ActiveX或其他对象中检索值,才能将其传递给VBArray构造函数。” 但是responseBody的文档http://msdn.microsoft.com/en-us/library/ms534368(VS.85).aspx没有指示它是safeArray。 - Cheeso

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接