为什么 String.fromCharCode(0xd800) 到 String.fromCharCode(0xdfff) return 替换字符?

Why does String.fromCharCode(0xd800) to String.fromCharCode(0xdfff) return the replacement character?

为什么会这样:

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

DFFF₁₆ 是 55296₁₀。我用 String.fromCodePoint().

得到相同的结果

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

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

除了 UTF-16 中的这一特殊含义外,这些都不是有效字符。所以 String.fromCharCode 基本上说“你没有提供有效的字符串数据”并使用 Unicode 替换字符来代替是合理的。