UTF-8 ArrayBuffer和String之间的转换

Tom*_*ese 57 javascript string utf-8 arraybuffer

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

我已经在很多地方看到过这段代码,但我看不出它如何适用于长度超过1个字节的任何UTF-8代码点.

return String.fromCharCode.apply(null, new Uint8Array(data));
Run Code Online (Sandbox Code Playgroud)

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

PPB*_*PPB 47

使用TextEncoderTextDecoder

var uint8array = new TextEncoder("utf-8").encode("Plain Text");
var string = new TextDecoder().decode(uint8array);
console.log(uint8array ,string )
Run Code Online (Sandbox Code Playgroud)

  • [IE和Edge]中非常缺乏对此功能的支持(https://caniuse.com/#feat=textencoder). (7认同)
  • 请注意,TextEncoder c`tor 不接受任何参数(无论您传入什么,它始终是 utf-8)。然而,解码器确实接受参数(文档及其工作方式实际上与此一致)。 (5认同)
  • 对于 2021 年遇到这个问题的人来说,每个主要浏览器现在都支持 TextEncoder/Decoder:https://caniuse.com/textencoder (4认同)

Nic*_*ngo 39

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

在互联网的帮助下,我已经完成了这些小功能,他们应该解决你的问题!这是工作的JSFiddle.

编辑:

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

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

  • 完成.对于`stringToUint`函数也是如此,只需删除`btoa`函数即可完成:) (2认同)
  • 你救了我的命!只是一个补充,如果你将它与巨大的数组一起使用,你可以很容易地得到:“[Error] RangeError:超出最大调用堆栈大小。”为了解决这个问题,我使用“.slice()”并将其应用到块中 (2认同)
  • 这个答案已经过时,请转到此处:/sf/ask/487557521/ Between-strings-and-arraybuffers (2认同)

Alb*_*ert 23

这应该工作:

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

它与其他解决方案相比更加清晰,因为它不使用任何hacks,也不依赖于Browser JS功能,例如也适用于其他JS环境.

查看JSFiddle演示.

另请参阅相关问题:此处,此处

  • 当从字符串到 utf-8 缓冲区时呢? (4认同)

小智 17

在Github上有一个用于编码的 polyfill:文本编码.Node或浏览器很容易,自述文件建议如下:

var uint8array = TextEncoder(encoding).encode(string);
var string = TextDecoder(encoding).decode(uint8array);
Run Code Online (Sandbox Code Playgroud)

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

var uint8array = new Uint8Array(utf8buffer);
Run Code Online (Sandbox Code Playgroud)

希望它对你有用,对我来说也是如此.

  • 小心图书馆是巨大的 (4认同)
  • 对于像我这样懒惰的人,`npm install text-encoding`,`var textEncoding = require('text-encoding'); var TextDecoder = textEncoding.TextDecoder;`.不用了,谢谢. (3认同)

Esa*_*ija 10

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

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

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