UTF-8 ArrayBuffer 和 String 之间的转换

IT技术 javascript string utf-8 arraybuffer
2021-01-29 00:27:22

我有一个ArrayBuffer包含使用 UTF-8 编码的字符串,但我找不到将其转换ArrayBuffer为 JS的标准方法String(我理解它是使用 UTF-16 编码的)。

我在很多地方都看到过这段代码,但我看不出它如何处理任何长度超过 1 个字节的 UTF-8 代码点。

return String.fromCharCode.apply(null, new Uint8Array(data));

同样,我找不到从 aString转换为 UTF-8 编码的标准方法ArrayBuffer

6个回答

使用TextEncoderTextDecoder

var uint8array = new TextEncoder("utf-8").encode("Plain Text");
var string = new TextDecoder().decode(uint8array);
console.log(uint8array ,string )
对于 2021 年遇到此问题的任何人,现在每个主要浏览器都支持 TextEncoder/Decoder:caniuse.com/textencoder
2021-03-27 00:27:22
很好的答案,但使用“纯文本”是一种误导,我们在这里没有做任何加密编码!= 加密
2021-03-31 00:27:22
IE 和 Edge 非常缺乏对这个功能的支持
2021-04-01 00:27:22
请注意, TextEncoder c`tor 不接受任何参数(无论您传入什么,它始终是 utf-8)。然而,解码器确实接受参数(文档及其工作方式实际上与此一致)。
2021-04-06 00:27:22
出于某种原因,TextEncoder 只有一个 polyfill,我假设 TextDecoding 现在根本无法在 IE 中工作。
2021-04-11 00:27:22
function stringToUint(string) {
    var string = btoa(unescape(encodeURIComponent(string))),
        charList = string.split(''),
        uintArray = [];
    for (var i = 0; i < charList.length; i++) {
        uintArray.push(charList[i].charCodeAt(0));
    }
    return new Uint8Array(uintArray);
}

function uintToString(uintArray) {
    var encodedString = String.fromCharCode.apply(null, uintArray),
        decodedString = decodeURIComponent(escape(atob(encodedString)));
    return decodedString;
}

我已经完成了,借助互联网的一些帮助,这些小功能应该可以解决您的问题!这是工作中的 JSFiddle

编辑

由于 Uint8Array 的来源是外部的,您不能使用,atob您只需要将其删除(工作小提琴):

function uintToString(uintArray) {
    var encodedString = String.fromCharCode.apply(null, uintArray),
        decodedString = decodeURIComponent(escape(encodedString));
    return decodedString;
}

警告:escape 和 unescape 已从 Web 标准中删除。 看到这个。

atob/btoa做 base64 编码/解码,如果你传递一个诚实的 utf8 字节数组,它将不起作用:jsfiddle.net/Z9pQE/1
2021-03-18 00:27:22
拟工作只有一个编码字符串的UintArray,否则它是不会因为工作btoaatob转换。
2021-03-22 00:27:22
你救了我的一天!只是一个补充,如果你将它与巨大的数组一起使用,你可以很容易地得到: [Error] RangeError: Maximum call stack size exceeded. 为了修复我使用.slice()并分块应用它
2021-03-22 00:27:22
完毕。stringToUint功能也是如此,只需删除该btoa功能即可完成:)
2021-03-31 00:27:22
这个答案已经过时了,去这里:stackoverflow.com/questions/6965107/...
2021-04-03 00:27:22

这应该有效:

// 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 演示

另请参阅相关问题:here , here

当从字符串到 utf-8 缓冲区时呢?
2021-04-01 00:27:22

Github 上有一个用于编码的polyfill:text-encoding对于 Node 或浏览器来说很容易,自述文件建议如下:

var uint8array = TextEncoder(encoding).encode(string);
var string = TextDecoder(encoding).decode(uint8array);

如果我记得,'utf-8'encoding你需要的,当然你需要包装你的缓冲区:

var uint8array = new Uint8Array(utf8buffer);

希望它对你和我一样有效。

对于像我这样懒惰的人npm install text-encoding,,var textEncoding = require('text-encoding'); var TextDecoder = textEncoding.TextDecoder;不用了,谢谢。
2021-03-29 00:27:22
当心图书馆很大
2021-03-31 00:27:22
@KarthikHande 这就是 polyfill 的用途。并非所有浏览器都支持它,因此您还可以提供纯 js 实现作为替代。
2021-04-10 00:27:22

如果您在浏览器中执行此操作,则没有内置字符编码库,但您可以通过:

function pad(n) {
    return n.length < 2 ? "0" + n : n;
}

var array = new Uint8Array(data);
var str = "";
for( var i = 0, len = array.length; i < len; ++i ) {
    str += ( "%" + pad(array[i].toString(16)))
}

str = decodeURIComponent(str);

这是一个解码 3 字节 UTF-8 单元的演示:http : //jsfiddle.net/Z9pQE/

你是世界上最好的人。
2021-03-30 00:27:22