本章說明 ECMAScript 6 帶來的 Unicode 支援改進。如要了解 Unicode 的一般介紹,請閱讀「Speaking JavaScript」中的第 24 章「Unicode 和 JavaScript」。
ECMAScript 6 在三個領域改進了對 Unicode 的支援
\u{···}
String.prototype.codePointAt()
讀取碼位值。String.fromCodePoint()
從碼位值建立字串。/u
(加上布林屬性 unicode
)改善了代理對的處理。此外,ES6 基於 Unicode 版本 5.1.0,而 ES5 基於 Unicode 版本 3.0。
JavaScript 中有三個參數化跳脫序列,用於表示字元
\xHH
> '\x7A' === 'z'
true
\uHHHH
> '\u007A' === 'z'
true
\u{···}
> '\u{7A}' === 'z'
true
Unicode 碼位跳脫在 ES6 中是新的。它們讓您可以指定超過 16 位元的碼位。如果您要在 ECMAScript 5 中執行此操作,您必須將每個碼位編碼為兩個 UTF-16 碼元(「代理對」)。這些碼元可以用 Unicode 跳脫表示。例如,下列陳述式會將火箭(碼位 0x1F680)記錄到大多數主控台
console
.
log
(
'\uD83D\uDE80'
);
使用 Unicode 碼點跳脫字元,你可以直接指定大於 16 位元的碼點
console
.
log
(
'\u{1F680}'
);
跳脫序列可以在下列位置使用
\uHHHH |
\u{···} |
\xHH |
|
---|---|---|---|
識別碼 | ✔ | ✔ | |
字串文字 | ✔ | ✔ | ✔ |
範本文字 | ✔ | ✔ | ✔ |
正規表示式文字 | ✔ | 僅限於旗標 /u
|
✔ |
識別碼
\uHHHH
會變成單一碼點。\u{···}
會變成單一碼點。
> const hello = 123;
> hell\u{6F}
123
字串文字
\xHH
會產生一個 UTF-16 碼元。\uHHHH
會產生一個 UTF-16 碼元。\u{···}
會產生其碼點的 UTF-16 編碼(一個或兩個 UTF-16 碼元)。範本文字
> `hell\u{6F}` // cooked
'hello'
> String.raw`hell\u{6F}` // raw
'hell\\u{6F}'
正規表示式
/u
已設定時,Unicode 碼點跳脫字元才被允許,因為 \u{3}
會被解譯為字元 u
三次,否則
> /^\u{3}$/.test('uuu')
true
各種資訊
規範區分 BMP 模式(未設定旗標 /u
)和 Unicode 模式(已設定旗標 /u
)。章節「模式語意」說明它們的處理方式不同,以及如何處理。
作為提醒,以下是語法規則在規範中參數化的方式
R
有下標 [U]
,表示它有兩個版本:R
和 R_U
。[?U]
傳遞下標。[+U]
,它只有在下標 [U]
存在時才會存在。[~U]
,它只有在下標 [U]
不存在時才會存在。您可以在「模式」章節中看到此參數化的實際應用,其中下標 [U]
為 BMP 模式和 Unicode 模式建立了不同的文法。
\u
後面沒有四個十六進位數字,它會被解釋為 u
)。在 Unicode 模式中,這只對下列字元有效(這讓 \u
可以用於 Unicode 碼點跳脫):^ $ \ . * + ? ( ) [ ] { } |
"\u{" HexDigits "}"
只允許在 Unicode 模式中。在這些模式中,前導和後隨代理也會被分組,以協助 UTF-16 解碼。「字元跳脫」章節說明了各種跳脫序列如何轉換為字元(大致上:碼單元或碼點)。