如何使用JavaScript Typed Arrays的字符串

时间:2011-11-16 14:59:10

标签: javascript html5 typed-arrays

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

示例:

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

3 个答案:

答案 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)

您可以使用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!");
}

答案 2 :(得分:0)

如果您愿意使用外部库,可以查看jDataView,它支持从TypedArray中读取不同编码中的strings并处理字节顺序转换。