我有一些 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);
}