具有 2 个不同代码点(形成 1 个字符)的字符串是否可以考虑代理对?

Can the the string with 2 different codepoints, which form 1 character, consider a surrogate pair?

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

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

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

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

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

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

UTF-16 中的代理项对由两个 16 位代码组成,而不是代码点。正如 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 的实际含义及其工作原理。

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