gpt4 book ai didi

javascript - String.fromCodePoint/String#codePointAt 的意外行为 (Firefox/ES6)

转载 作者:行者123 更新时间:2023-12-02 17:21:09 25 4
gpt4 key购买 nike

从 Firefox 29 版本开始,Mozilla 提供 String.fromCodePointString#codePointAt方法,并在各自的 MDN 页面上发布了 polyfill。

所以碰巧我目前正在尝试这个,似乎我错过了一些重要的东西,因为将字符串“ä☺𠜎”分割成代码点并从这些代码点重新组装它会返回一个至少对我来说意外的结果。

我构建了一个测试用例:http://jsfiddle.net/dcodeIO/YhwP7/

var str = "ä☺𠜎";
...split it, reassemble it...

我错过了什么吗?

最佳答案

这不是.codePointAt的问题,更多的是字符𠜎的char编码的问题。 𠜎 的 JavaScript 字符串长度为 2。

为什么?因为 Javascript 字符串是使用 2 字节 UTF-16 编码的。 𠜎 ( charcode: 132878 ) 大于 2 字节 UTF-16 ( 0-65535 )。这意味着它需要使用 4 字节 UTF-16 进行编码。其 UTF-16 表示形式为 0xD841 0xDF0E,占用字符串中的两个字符。

当使用.charAt()时,您将看到正确的值:

var string = "𠜎";
console.log( string.charAt(0), string.charAt(1) ); // logs 55361 57102 (0xD841 0xDF0E)

为什么不显示228、9786、55361、57102这是因为 .codePointAt() 正确地将 4 字节 UTF-16 字符转换为整数 ( 132878 )。

那么为什么它会输出 57,102 呢?因为您在循环中迭代 str.length,它返回 4(因为 "𠜎".length == "),所以 .codePointAt() 将在 str[3] 上执行,即 57102

关于javascript - String.fromCodePoint/String#codePointAt 的意外行为 (Firefox/ES6),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23942137/

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