【问题标题】:How to use strings with JavaScript Typed Arrays如何在 JavaScript 类型数组中使用字符串
【发布时间】:2011-11-16 14:59:09
【问题描述】:

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

示例:

我有一个 UTF8 编码的字符串,“Something or other”,我想将其写入 ArrayBuffer 长度然后是字符串格式。

【问题讨论】:

  • 您到底想要什么样的转换?能给我们举个例子吗?
  • 类型化数组仅适用于数字。您需要以某种方式将字符串转换为数字,即str.charCodeAtString.fromCharCode。不过,您可以让它更方便:jsfiddle.net/ACXM7.
  • 为什么要将它们存储在类型化数组中?听起来您想模拟一个简单 js 字符串的内部表示 :-)

标签: javascript html typed-arrays


【解决方案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】:

    这应该可以解决您的问题

    How to use strings with JavaScript Typed Arrays

    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);
    };
    

    以及这些函数将字符串与数组缓冲区相互转换

        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;
         }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-01
        • 1970-01-01
        • 2011-05-24
        • 2014-10-19
        • 2015-01-24
        • 2020-03-02
        相关资源
        最近更新 更多