我遇到了一个问题,我没有看到一种方法可以轻松地将字符串转换为类型化数组,并且从类型化数组转换为字符串似乎是一个真正的痛苦,需要为每个字节进行手动字符代码转换。有没有更好的方法将字符串转换为类型化数组,反之亦然?
示例:
我有一个UTF8编码的字符串,“Something or other”,我想把它写成一个长度比字符串格式的ArrayBuffer。
答案 0 :(得分:3)
这应该可以解决您的问题
How to use strings with JavaScript Typed Arrays
JS字符串以UTF-16编码存储,每个字符占用2个字节。 String.charCodeAt返回这些2字节的Unicodes。这是如何从DataView读取UTF-16编码的字符串:
DataView.prototype.getUTF16String = function(offset, length) {
var utf16 = new ArrayBuffer(length * 2);
var utf16View = new Uint16Array(utf16);
for (var i = 0; i < length; ++i) {
utf16View[i] = this.getUint8(offset + i);
}
return String.fromCharCode.apply(null, utf16View);
};
和这些函数将字符串转换为arraybuffer
function ab2str(buf) {
return String.fromCharCode.apply(null, new Uint16Array(buf));
}
function str2ab(str) {
var buf = new ArrayBuffer(str.length*2); // 2 bytes for each char
var bufView = new Uint16Array(buf);
for (var i=0, strLen=str.length; i<strLen; i++) {
bufView[i] = str.charCodeAt(i);
}
return buf;
}
答案 1 :(得分:1)
您可以使用TextEncoder和TextDecoder,目前这些似乎只在Firefox中实现。在您提出初步问题后的整整两年:)
幸运的是,有一个polyfill可以完成这项任务。
var initialString = "Something or other";
var utf8EncodedString = new TextEncoder("utf-8").encode(initialString);
// utf8EncodedString is a Uint8Array, so you can inspect
// the individual bytes directly:
for (var i = 0; i < utf8EncodedString.length; ++i) {
console.log(utf8EncodedString[i]);
}
var decodedString = new TextDecoder("utf-8").decode(utf8EncodedString);
if (initialString !== decodedString) {
console.error("You're lying!");
}
答案 2 :(得分:0)