-1

据我所知,代理对是 1 个字符的两个 16 位代码点。代理对用于不能以 16 位写入的“大”代码点。

所以,我的问题是......这可以考虑一个代理对还是只是一个字符串中不同字符的组合?

let str = '\u0057\u0303';
console.log(str);

基本上它是由两个代码点组成的一个字符。但我们也可以以相同的方式在一个字符中组合两个以上的代码点。例如:

console.log('\u0053\u0307\u0323');

那么,这是一对替代品吗?如果不是,代理对是什么样子的?

4

1 回答 1

1

UTF-16中的代理对由两个 16 位 CODEUNITS 组成,而不是 CODEPOINTS。就像 UTF-8 每个 CODEPOINT 使用 1..4 个 8 位 CODEUNIT 一样,UTF-32 每个 CODEPOINT 使用 1 个 32 位 CODEUNIT 等等。

CODEPOINTS 和 CODEUNITS 不是一回事,所以不要混淆它们。CODEUNITS 是 Unicode 分配给每个符号的实际数字。CODEUNITS 用于以特定的 UTF 编码表示 CODEPOINTS。

不,您的示例不是代理对。代理对的高位字符始终在范围内\uD800..\uDBFF,而低位字符始终在范围内\uDC00..\uDFFF。你的例子不是。对于为什么存在此要求,我建议您阅读UTF-16究竟是什么以及它是如何工作的。

多个代码点可以组合在一起以创建图形(您认为是字符),但并非所有代码点都可以组合,只有某些具有组合特征的代码点可以与其他代码点组合,并且只能以 Unicode 定义的某些方式组合。因此,您不能随意组合 CODEPOINTS。

于 2021-09-07T21:24:22.273 回答