EcmaScript言語仕様のセクション8.4は言う
String に実際のテキスト データが含まれている場合、各要素は単一の UTF-16 コード単位と見なされます。これが文字列の実際の格納形式であるかどうかにかかわらず、文字列内の文字は、UTF-16 を使用して表されているかのように、最初のコード単位要素の位置によって番号が付けられます。文字列に対するすべての操作 (特に明記されている場合を除く) は、文字列を未微分 16 ビット符号なし整数のシーケンスとして扱います。結果の文字列が正規化された形式であることも、言語に依存した結果であることも保証されません。
したがって、補助コードポイントを UTF-16 コード単位のペアとしてエンコードする必要があります。
記事「Java プラットフォームの補助文字」では、これを行う方法が適切に説明されています。
UTF-16 は、1 つまたは 2 つの符号なし 16 ビット コード単位のシーケンスを使用して、Unicode コード ポイントをエンコードします。U+0000 から U+FFFF までの値は、同じ値で 16 ビット単位でエンコードされます。補助文字は 2 つのコード単位でエンコードされます。1 つ目は高サロゲート範囲 (U+D800 から U+DBFF) からのもので、2 つ目は低サロゲート範囲 (U+DC00 から U+DFFF) のものです。これはマルチバイト エンコーディングとコンセプトが似ているように見えるかもしれませんが、重要な違いがあります。コード ポイントとして割り当てられる文字はありません。つまり、ソフトウェアは、文字列内の個々のコード単位について、それが 1 単位の文字を表しているのか、それとも 2 単位の文字の最初または 2 番目の単位なのかを判断できます。これは、一部の従来のマルチバイト文字エンコーディングよりも大幅に改善されています。
次の表は、いくつかの文字の異なる表現を比較して示しています。
コード ポイント / UTF-16 コード単位
U+0041 / 0041
U+00DF / 00DF
U+6771 / 6771
U+10400 / D801 DC00
UTF-16 コード単位がわかったら、javascript 関数を使用して文字列を作成できますString.fromCharCode
。
String.fromCharCode(0xd801, 0xdc00) === ''