A | U+0041 | LATIN CAPITAL LETTER A |
a | U+0061 | LATIN SMALL LETTER A |
© |
U+00A9 | COPYRIGHT SIGN |
☃ |
U+2603 | SNOWMAN |
|
U+1F4A9 | PILE OF POO |
>> '\x41\x42\x43' 'ABC' >> '\x61\x62\x63' 'abc'
>> '\u0041\u0042\u0043' 'ABC' >> 'I \u2661 JavaScript!' 'I ♡ JavaScript!'
>> '\u{41}\u{42}\u{43}' 'ABC' >> '\u{1F4A9}' '' // U+1F4A9 PILE OF POO
(好吧.. 个人编辑器已经显示不了 PILE OF POO 了 - -!). 在大括号以前你可使用最多6位16进制数, 能够表示出全部的Unicode码位.
为了向后兼容ECMAScript5和更早的环境, 一个很差的方案就是使用替代组合:
>> '\uD83D\uDCA9' '' // U+1F4A9 PILE OF POO
由二者组成一个星际符号. 要注意的是这两个组成部分已经失去了它们自己的码位意义.
使用这种替代组合后, 全部的星际码位均可以被表示了.. 你们应该已经感受到了, 单个码位能够表示的BMP与须要替代组合才能表示的星际符号混在一块儿, 使人困惑, 甚至会形成讨厌的后果.
在JavaScript里计算字符数
若是你想计算字符串的长度你会怎么作?
我首先想到的是用 length 属性.
>> 'A'.length // U+0041 LATIN CAPITAL LETTER A 1 >> 'A' == '\u0041' true >> 'B'.length // U+0042 LATIN CAPITAL LETTER B 1 >> 'B' == '\u0042' true
上面的例子里, length 属性确实表示了字符的数量. (这说得通, 由于若是咱们使用转义序列来表示这个字符, 只须要一个转义就能够(\u0041 表示 A)).
来看一个不同的例子:
>> '퐀'.length // U+1D400 MATHEMATICAL BOLD CAPITAL A 2 >> '퐀' == '\uD835\uDC00' true >> '퐁'.length // U+1D401 MATHEMATICAL BOLD CAPITAL B 2 >> '퐁' == '\uD835\uDC01' true >> ''.length // U+1F4A9 PILE OF POO 2 >> '' == '\uD83D\uDCA9' true
在JavaScript内部, 使用上文提到的替代组合来表示星际字符, 而且暴露出组成替代组合的2个字符. 若是你使用ECMAScript 5兼容的转义序列来表示符号, 就须要2个转义字符来表示一个星际符号. 这使人困惑, 由于人们一般是以一个Unicode符号或字母的一个总体来考虑它们, 而不是把一个星际字符想成2部分.
(未完待续)