0xd7ff
,0xe000
,(code << 10) + next - 0x35fdc00
是什么意思
const nonASCIIwhitespace = /[u1680u180eu2000-u200au202fu205fu3000ufeff]/
const fullCharCodeAtPos = (input: string, pos: number) => {
if (String.fromCharCode) return input.codePointAt(pos)
const code = input.charCodeAt(pos)
if (code <= 0xd7ff || code >= 0xe000) return code
const next = input.charCodeAt(pos + 1)
return (code << 10) + next - 0x35fdc00
}
当且仅当code
不是代理时,条件(code <= 0xd7ff || code >= 0xe000)
为true,参见UnicodeData.txt:
… D800;<Non Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;; DB7F;<Non Private Use High Surrogate, Last>;Cs;0;L;;;;;N;;;;; DB80;<Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;; DBFF;<Private Use High Surrogate, Last>;Cs;0;L;;;;;N;;;;; DC00;<Low Surrogate, First>;Cs;0;L;;;;;N;;;;; DFFF;<Low Surrogate, Last>;Cs;0;L;;;;;N;;;;; …
替代物在0xD800
(== 0xd7ff + 1
)和0xDFFF
(== 0xe000 - 1
)之间。
公式(code << 10) + next - 0x35fdc00
将UTF-16代理对code
,next
解码为代码点(在基本多语言平面之上)。
这个公式是更容易理解的
的另一种形式0x10000 + ((code - 0xD800) << 10) + (next - 0xDC00)
(见WTF-8编码优秀文章)。