【发布时间】:2017-02-11 20:49:21
【问题描述】:
我太糊涂了。为什么在使用 ECMAScript 6 原生 Unicode 帮助程序时,从 U+D800 到 U+DBFF 的代码点编码为单个(2 字节)字符串元素?
我不是在问 JavaScript/ECMAScript 如何对字符串进行原生编码,我是在问一个使用 UCS-2 编码 UTF-16 的额外功能。
var str1 = '\u{D800}';
var str2 = String.fromCodePoint(0xD800);
console.log(
str1.length, str1.charCodeAt(0), str1.charCodeAt(1)
);
console.log(
str2.length, str2.charCodeAt(0), str2.charCodeAt(1)
);
Re-TL;DR:我想知道为什么上面的方法会返回一个长度为1的字符串。 U+D800 不应该生成一个2 长度的字符串吗,因为我的浏览器的 ES6 实现在字符串中结合了 UCS-2 编码,每个字符代码使用 2 个字节?
这两种方法都为 U+D800 代码点返回一个单元素字符串(字符代码:55296,与 0xD800 相同)。但是对于大于 U+FFFF 的代码点,每个都返回一个包含两个元素的字符串,即前导和尾随。前导将是 U+D800 和 U+DBFF 之间的一个数字,我不确定,我只知道它有助于更改结果代码点。对我来说,返回值没有意义,它代表没有线索的领先。我是不是理解错了?
【问题讨论】:
-
使用
codePointAt而不是charCodeAt。后者只会返回代理对的第一个代码单元的信息。 -
@4castle 我以 charCodeAt() 为例说明发生了什么,您可以看到这两种方法的结果字符串仅包含一个代码单元。
-
我不确定我是否完全理解您的问题。它产生一个长度为一长度的字符串,因为这是你要求它做的。您想了解代理对吗?
-
stackoverflow.com/q/6885879/5217142 的可能重复项 - Javascript 未将字符串实现为 Unicode 字符。相反,它记录了用于对 Unicode 字符进行编码的 16 位值序列。不幸的是,这导致单个 Unicode 字符的字符串长度为 2,需要 UTF-16 编码中的代理对。
-
@handoncloud ...好吧,这不是“独特”的意思。你想要“单身”。
标签: javascript unicode ecmascript-6 utf-16