从Uint8Array转换为UTF-16字符串冻结/崩溃浏览器

时间:2016-07-01 12:17:02

标签: javascript string google-chrome encoding v8

我从服务器获取某种编码数据,应该正确解码并在客户端上显示为字符串(UTF-16)。到目前为止,我正在做这样的事情:

_decodeContent: function(encodedContent) {
  var binaryContent = atob(encodedContent);
  var result = pako.inflate(binaryContent, { to: 'string' });

  return result;
}

在大多数情况下,它工作正常。但有时客户端必须处理大量数据,因此它冻结(谷歌Chrome 51.0.2704.84)甚至崩溃(Chromium 50.0.2661.102)浏览器选项卡。所以我发现,问题是在pako的inflate方法中{to:'string'}选项,同时尝试将包含大约50kk元素的Uint8Array转换为UTF-16字符串。

我试图用这样的方式转换这个:

_decodeContent: function(encodedContent) {
  var binaryContent = atob(encodedContent);
  var utf8 = pako.inflate(binaryContent);
  var result = String.fromCharCode.apply(null, utf8);

  return result;
}

但它会产生:未捕获RangeError:超出最大调用堆栈大小

所以现在我正在寻找解决方案,让事情更快,或者至少防止浏览器崩溃。有什么想法吗?

UPD:尝试使用块进行String.fromCharCode.apply以防止异常。因此解决了异常的问题,但它比第一个解决方案慢了大约两倍。

UPD:所以问题是如何将大量的Uint8Array转换为UTF-16字符串,防止浏览器冻结。

1 个答案:

答案 0 :(得分:1)

我使用 TextDecoder() 避免了 Firefox 86 浏览器在 100 MB 字符串上崩溃,不需要分块。 YMMV 在较大的字符串上。

如果可以避免,请使用浏览器和服务器的内置 Content-Encoding: gzip,这样会更快,并为您节省要导入的库。