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 将引发错误。
我有 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 将引发错误。