我有一些 UTF-8 编码的数据存在于 Javascript 中的一系列 Uint8Array 元素中。有没有一种有效的方法可以将这些解码为常规的 javascript 字符串(我相信 Javascript 使用 16 位 Unicode)?我不想在当时添加一个字符,因为字符串连接会占用 CPU。
Uint8Array 到 Javascript 中的字符串
IT技术
javascript
2021-02-05 13:32:04
6个回答
TextEncoder
并TextDecoder
根据由stringencoding 库填充的编码标准,在字符串和 ArrayBuffers 之间进行转换:
var uint8array = new TextEncoder().encode("¢");
var string = new TextDecoder().decode(uint8array);
这应该有效:
// http://www.onicos.com/staff/iz/amuse/javascript/expert/utf.txt
/* utf.js - UTF-8 <=> UTF-16 convertion
*
* Copyright (C) 1999 Masanao Izumo <iz@onicos.co.jp>
* Version: 1.0
* LastModified: Dec 25 1999
* This library is free. You can redistribute it and/or modify it.
*/
function Utf8ArrayToStr(array) {
var out, i, len, c;
var char2, char3;
out = "";
len = array.length;
i = 0;
while(i < len) {
c = array[i++];
switch(c >> 4)
{
case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
// 0xxxxxxx
out += String.fromCharCode(c);
break;
case 12: case 13:
// 110x xxxx 10xx xxxx
char2 = array[i++];
out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
break;
case 14:
// 1110 xxxx 10xx xxxx 10xx xxxx
char2 = array[i++];
char3 = array[i++];
out += String.fromCharCode(((c & 0x0F) << 12) |
((char2 & 0x3F) << 6) |
((char3 & 0x3F) << 0));
break;
}
}
return out;
}
它比其他解决方案更简洁,因为它不使用任何 hacks 也不依赖于浏览器 JS 功能,例如也适用于其他 JS 环境。
查看JSFiddle 演示。
这是我使用的:
var str = String.fromCharCode.apply(null, uint8Arr);
在 Node 中,“Buffer
实例也是Uint8Array
实例”,所以buf.toString()
在这种情况下有效。
可在 Chrome 示例应用程序之一中找到,尽管这适用于可以进行异步转换的较大数据块。
/**
* Converts an array buffer to a string
*
* @private
* @param {ArrayBuffer} buf The buffer to convert
* @param {Function} callback The function to call when conversion is complete
*/
function _arrayBufferToString(buf, callback) {
var bb = new Blob([new Uint8Array(buf)]);
var f = new FileReader();
f.onload = function(e) {
callback(e.target.result);
};
f.readAsText(bb);
}