我从服务器获取某种编码数据,应该正确解码并在客户端上显示为字符串(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字符串,防止浏览器冻结。
答案 0 :(得分:1)
我使用 TextDecoder()
避免了 Firefox 86 浏览器在 100 MB 字符串上崩溃,不需要分块。 YMMV 在较大的字符串上。
如果可以避免,请使用浏览器和服务器的内置 Content-Encoding: gzip,这样会更快,并为您节省要导入的库。