この章では、ECMAScript 6がもたらすUnicodeの改善されたサポートについて説明します。Unicodeの一般的な概要については、「Speaking JavaScript」の「UnicodeとJavaScript」の章をお読みください。
ECMAScript 6では、Unicodeのサポートが次の3つの領域で改善されています。
\u{···}
String.prototype.codePointAt()
を介してコードポイント値を読み取ります。String.fromCodePoint()
を介してコードポイント値から文字列を作成します。/u
(およびブール値プロパティ unicode
) は、サロゲートペアの処理を改善します。さらに、ES6はUnicodeバージョン5.1.0に基づいていますが、ES5はUnicodeバージョン3.0に基づいています。
JavaScriptで文字を表すための、パラメータ化されたエスケープシーケンスが3つあります。
\xHH
> '\x7A' === 'z'
true
\uHHHH
> '\u007A' === 'z'
true
\u{···}
> '\u{7A}' === 'z'
true
UnicodeコードポイントエスケープはES6の新機能です。これにより、16ビットを超えるコードポイントを指定できます。ECMAScript 5でこれを行う場合は、各コードポイントを2つの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エンコーディング (1つまたは2つのUTF-16コードユニット) を提供します。テンプレートリテラル
> `hell\u{6F}` // cooked
'hello'
> String.raw`hell\u{6F}` // raw
'hell\\u{6F}'
正規表現
/u
が設定されている場合にのみ許可されます。設定されていない場合、\u{3}
は文字 u
が3回繰り返されたものとして解釈されるためです。
> /^\u{3}$/.test('uuu')
true
さまざまな情報
仕様では、BMPパターン (フラグ /u
が設定されていない) とUnicodeパターン (フラグ /u
が設定されている) を区別しています。「パターンのセマンティクス」セクションでは、それらがどのように異なって処理されるかについて説明しています。
参考までに、仕様で文法規則がパラメータ化される方法を以下に示します。
R
に添え字 [U]
がある場合、それはその規則に2つのバージョンがあることを意味します: R
と R_U
です。[?U]
を介して添え字を渡すことができます。[+U]
がある場合、添え字 [U]
が存在する場合にのみ存在します。[~U]
がある場合、添え字 [U]
が存在しない場合にのみ存在します。このパラメータ化は、「パターン」セクションで確認できます。ここで、添え字 [U]
はBMPパターンとUnicodeパターンのための個別の文法を作成します。
\u
の後に4桁の16進数が続かない場合、u
として解釈されます)。Unicodeパターンでは、これは次の文字に対してのみ機能します (これにより、\u
がUnicodeコードポイントエスケープに使用できるようになります): ^ $ \ . * + ? ( ) [ ] { } |
"\u{" HexDigits "}"
は、Unicodeパターンでのみ許可されます。これらのパターンでは、先行サロゲートと後続サロゲートもグループ化されて、UTF-16デコードに役立ちます。「CharacterEscape」セクションでは、さまざまなエスケープシーケンスが*文字* (おおまかに: コードユニットまたはコードポイント) に変換される方法について説明しています。