0

为什么会这样:

> String.fromCharCode(0xd7FF)
'퟿'
> String.fromCharCode(0xd800)
'�'
> String.fromCharCode(0xdffe) // (and everything in between)
'�'
> String.fromCharCode(0xdfff)
'�'
> String.fromCharCode(0xe000)
''

DFFF₁₆ 是 55296₁₀。我得到相同的结果String.fromCodePoint()

4

1 回答 1

2

代码点 U+D800 到 U+DFFF 保留用于surrogate的 UTF-16 编码。实际上,这些字符永远不会单独有效——它们总是以代理对的形式出现——高代理后跟低代理。(令人困惑的是,“高代理”范围是 U+D800 到 U+DBFF 的范围,而“低代理”范围是 U+DC00 到 U+DFFF 的范围。)

这对字符在 UTF-16 中组合以表示基本多语言平面之外的单个字符。

在 UTF-16 中的这个特殊含义之外,这些不是有效字符。因此,String.fromCharCode基本上说“您没有提供有效的字符串数据”并使用 Unicode 替换字符是合理的。

于 2021-03-17T20:53:34.590 回答