如何使用JavaScript Typed Arrays的字符串

Ada*_*M-W 7 javascript html5 typed-arrays

我遇到了一个问题,我没有看到一种方法可以轻松地将字符串转换为类型化数组,并且从类型化数组转换为字符串似乎是一个真正的痛苦,需要为每个字节进行手动字符代码转换.有没有更好的方法将字符串转换为类型化数组或反之亦然?

例:

我有一个UTF8编码的字符串,"Something or other",我想把它写成一个长度比字符串格式的ArrayBuffer.

Kon*_*aju 5

这应该可以解决您的问题

如何在 JavaScript 类型数组中使用字符串

JS 字符串以 UTF-16 编码存储,其中每个字符占用 2 个字节。String.charCodeAt 返回这些 2 字节的 Unicode。这是从 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);
};
Run Code Online (Sandbox Code Playgroud)

和这些函数来转换字符串和数组缓冲区

    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;
     }
Run Code Online (Sandbox Code Playgroud)


Mag*_*off 5

您可以使用TextEncoderTextDecoder,它最初仅在 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!");
}
Run Code Online (Sandbox Code Playgroud)