js采用UTF-16來對unicode進行編碼,在FFFF及更小的unicode碼中,UTF-16編碼與unicode碼是一模一樣的,所以'\uxxxx'直接根據unicode原碼表就能查出所需要的字符,無需轉換編碼。
當unicode碼大於FFFF時,utf-16就會引進標志位,用四個字節表示unicode編碼,此時UTF-16編碼就與我們查到的原unicode碼完全不一樣了。
而ES6中,可以使用'/u{xxxxx}' 直接根據unicode碼,輸出對應字符,無需轉化成utf-16: (xxxx是unicode碼的16進制形式)
"\u{20BB7}" // "𠮷"
上述字符,在ES6之前,只能通過轉換utf-16來輸出:
'\uD842\uDFB7' //"𠮷"
補充:
charCodeAt()得到的是utf-16的編碼的十進制數,並不是unicode編碼,這一點很多文檔都寫錯了
utf-8是可變長的,兼容ascii碼,小於等於1字節時等同於unicode碼,大於1字節時會有標志位,也就不同於unicode碼
附:
UTF-16編碼以16位無符號整數為單位。我們把Unicode編碼記作U。編碼規則如下:
如果U<0x10000,U的UTF-16編碼就是U對應的16位無符號整數(為書寫簡便,下文將16位無符號整數記作WORD)。
如果U≥0x10000,我們先計算U'=U-0x10000,然后將U'寫成二進制形式:yyyy yyyy yyxx xxxx xxxx,U的UTF-16編碼(二進制)就是:110110yyyyyyyyyy 110111xxxxxxxxxx