JavaScript中charcodeat的一些问题,0xd7ff,0xe000,0x35fdc00



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编码优秀文章)。

相关内容

  • 没有找到相关文章

最新更新