0

我有 UTF-32 数据,一个数组缓冲区。我需要将其转换为 ECMAScript 字符串。

有人告诉我,我可以将 TextDecoder 与 UTF-8 一起使用,而且它应该“正常工作”,我非常怀疑告诉我这个的人,但它仍然有效。

除了...输出文本充满了空字符(每个字符 3 个),因为将空字节填充读取为空字符,而不是将整个四个字节作为一个字符读取。例如:
\x70\x00\x00\x00
变成
PUTF-32;空填充被读取为一个字符
P\0\0\0UTF-8;分开的

根据 whatwg 编码规范,UTF-32 没有定义为要使用的编码标签,而是只有 UTF-8 和 UTF-16,而不是 UTF-32,有没有人对我如何实现正确的有任何建议UTF-32 解码,在浏览器中?

需要明确的是,我关心现代浏览器,所以我不包括 IE、Amaya、Android Webview 和 Netscape Navigator 等。

4

2 回答 2

2

将其解码为 UTF-8 绝对是错误的!正如你所发现的。除了 NUL 之外,它将无法完全解码 ASCII 之外的字符。

DataView您可以使用解码一个一个地读取代码点:

const utf32Decode = bytes => {
  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
  let result = '';
  
  for (let i = 0; i < bytes.length; i += 4) {
    result += String.fromCodePoint(view.getInt32(i, true));
  }
  
  return result;
};

const result = utf32Decode(new Uint8Array([0x70, 0x00, 0x00, 0x00]));
console.log(JSON.stringify(result));

getInt32由于(invalid lengths) 和String.fromCodePoint(invalid codepoints) ,无效的 UTF-32 会引发错误。

于 2020-11-06T01:37:27.403 回答
0

使用这个库:https ://github.com/ashtuchkin/iconv-lite 。它使用 browserify 或 webpack 在浏览器中工作(虽然它很大)。

例子:

const iconv = require("iconv-lite")

const yourBuffer = // however you're getting your buffer

const str = iconv.decode(yourBuffer, "utf32");
于 2020-11-06T01:36:34.287 回答