1

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

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

  return result;
}

在大多数情况下,它工作正常。但有时客户端必须处理大量数据,因此它会冻结(Google 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;
}

但它会产生:Uncaught RangeError: Maximum call stack size exceeded

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

UPD:尝试String.fromCharCode.apply使用块来防止异常。所以异常的问题得到了解决,但它的工作速度比第一个解决方案慢两倍。

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

4

1 回答 1

1

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

更新:该建议已在库中实施(问题 #228)

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

于 2021-06-30T06:59:25.423 回答