首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ECMAScript中的UTF-32解码

ECMAScript中的UTF-32解码
EN

Stack Overflow用户
提问于 2020-11-06 01:22:44
回答 2查看 560关注 0票数 1

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

有人告诉我,我可以在UTF-8中使用TextDecoder,而且它应该是“只起作用”,我对告诉我这一点的人非常怀疑,但它还是起了作用。

除了..。输出文本中填充空字符(每个字符3个),这是因为将空字节填充作为空字符来读取,而不是将整个四个字节作为一个字符读取。例:

\x70\x00\x00\x00

变成了

P UTF-32;空填充被读取为一个字符。

P\0\0\0 UTF-8;分离

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-06 01:37:27

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

您可以使用DataView逐个读取代码点来解码:

代码语言:javascript
复制
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));

无效的UTF-32会引发错误,这要归功于getInt32 (无效长度)和String.fromCodePoint (无效代码点)。

票数 1
EN

Stack Overflow用户

发布于 2020-11-06 01:36:34

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

示例:

代码语言:javascript
复制
const iconv = require("iconv-lite")

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

const str = iconv.decode(yourBuffer, "utf32");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64707608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档