gpt4 book ai didi

javascript - 将 Unicode 字符转换为十六进制会导致额外字节

转载 作者:太空宇宙 更新时间:2023-11-04 16:31:24 25 4
gpt4 key购买 nike

这是我用来转义多字节 unicode 字符的代码。

let sample = '1F3C4-1F3FB-200D-2640-FE0F'; //🏄🏻‍♀️
let characters = String.fromCodePoint(...sample.split('-').map(code => parseInt(code, 16)));
let codes = '';
for(let i=0;i<characters.length;i++){
codes += (i === 0 ? '' : '-') + characters.codePointAt(i).toString(16).toUpperCase();
}
console.log(codes); //1F3C4-DFC4-1F3FB-DFFB-200D-2640-FE0F

从示例中可以看出,转换会导致结果中出现 2 个额外字节。

我的代码有什么问题吗?我该如何修复它?

最佳答案

显然,codePointAt函数给出“一个表示给定索引处字符的代码单元值的数字”。但是,该索引与 charCodeAt 相同。 ,因此如果该索引位于代理对的中间(例如 \uD83C\uDFC4 代表 \u{1F3C4} ),则它只会给出代理对的后半部分。

您可以在输出中看到这一点,因为额外的字符出现在两个具有代理项对的字符(U+1xxxx字符)之后,并且它们是其前面的代理项对的后半部分。

如果您使用的是 ES6,则可以使用展开运算符来拆分 unicode 字符(同时不拆分代理项对,如 <em>string</em>.split() 那样):

const string = "\u{1F3C4}\u{1F3FB}\u200D\u2640\uFE0F";
console.log(string); // 🏄🏻‍♀️

const codes = [ ...string ].map(ch =>
ch.codePointAt(0).toString(16).toUpperCase()
).join('-');
console.log(codes); // 1F3C4-1F3FB-200D-2640-FE0F

关于javascript - 将 Unicode 字符转换为十六进制会导致额外字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39776530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com