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部分.
(未完待續)