JavaScript字符表示
JavaScript 字符串由 16 位码元(code unit)组成。对多数字符来说,每 16 位码元对应一个字符。换
句话说,字符串的 length 属性表示字符串包含多少 16 位码元
JavaScript 字符串使用了两种 Unicode 编码混合的策略:UCS-2 和 UTF-16。对于可以采用 16 位编码
的字符(U+0000~U+FFFF),这两种编码实际上是一样的。
查看指定码元
charCodeAt()
1 | let message = "abcde"; |
这个对应关系在扩展到 Unicode 增补字符平面时就不成立了。即 16 位只能唯一表示,65 536 个字符。这对于大多数语言字符集是足够了,在 Unicode 中称为基本多语言平面(BMP)。为了表示更多的字符,Unicode 采用了一个策略,即每个字符使用另外 16 位去选择一个增补平面。这种每个字符使用两个 16 位码元的策略称为代理对。
codePointAt()
为正确解析既包含单码元字符又包含代理对字符的字符串,可以使用 codePointAt()来代替charCodeAt()。跟使用 charCodeAt()时类似,codePointAt()接收 16 位码元的索引并返回该索引位置上的码点(code point)。码点是 Unicode 中一个字符的完整标识。比如,”c”的码点是 0x0063,而”☺”的码点是 0x1F60A。码点可能是 16 位,也可能是 32 位,而 codePointAt()方法可以从指定码元位置识别完整的码点。
1 | let message = "ab☺de"; |
给定UTF-16码原创建字符
fromCharCode()
1 | // Unicode "Latin small letter A"的编码是 U+0061 |
fromCodePoint()
fromCodePoint():这个方法接收任意数量的码点,返回对应字符拼接起来的字符串
1 | console.log(String.fromCharCode(97, 98, 55357, 56842, 100, 101)); // ab☺de |
normalize()规范化
Unicode提供了 4种规范化形式,可以将类似上面的字符规范化为一致的格式,无论底层字符的代码是什么。这 4种规范化形式是:NFD(Normalization Form D)、NFC(Normalization Form C)、
NFKD(Normalization Form KD)和 NFKC(Normalization Form KC)。可以使用 normalize()方法对字符串应用上述规范化形式,使用时需要传入表示哪种形式的字串:”NFD”、”NFC”、”NFKD”或”NFKC”。
通过比较字符串与其调用 normalize()的返回值,就可以知道该字符串是否已经规范化了
1 | let a1 = String.fromCharCode(0x00C5), |
未规范化:
1 | let a1 = String.fromCharCode(0x00C5), |
选择同一种规范化形式可以让比较操作符返回正确的结果:
1 | let a1 = String.fromCharCode(0x00C5), |