ECMAScript 中的 UTF-32 解码

UTF-32 decoding in ECMAScript

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

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

除了...输出文本充满了空字符(每个字符 3 个),这是因为将空字节填充读取为空字符,而不是将整个四个字节读取为一个字符。 前任:
\x70\x00\x00\x00
变成
P UTF-32;空填充被读取为一个字符
P[=12=][=12=][=12=] UTF-8;分离

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

明确地说,我关心现代浏览器,所以我排除了 IE、Amaya、Android Webview 和 Netscape Navigator 等

使用这个库:https://github.com/ashtuchkin/iconv-lite。它可以 in-browser 使用 browserify 或 webpack(虽然它相当大)。

示例:

const iconv = require("iconv-lite")

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

const str = iconv.decode(yourBuffer, "utf32");

解码为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(无效长度)和 String.fromCodePoint(无效代码点),无效的 UTF-32 将引发错误。