我有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等等。
发布于 2020-11-06 01:37:27
把它解码为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));
无效的UTF-32会引发错误,这要归功于getInt32 (无效长度)和String.fromCodePoint (无效代码点)。
发布于 2020-11-06 01:36:34
使用这个库:https://github.com/ashtuchkin/iconv-lite。它在浏览器中工作,使用的是浏览器化或webpack (虽然它很大)。
示例:
const iconv = require("iconv-lite")
const yourBuffer = // however you're getting your buffer
const str = iconv.decode(yourBuffer, "utf32");https://stackoverflow.com/questions/64707608
复制相似问题