サロゲートペア
UTF-16 で基本多言語面 (BMP) 外の文字を 2 つの 16 ビットコードユニットで表現する仕組み。
サロゲートペアとは、UTF-16 エンコーディングで基本多言語面 (BMP: U+0000〜U+FFFF) の範囲外にある文字を表現するための仕組みです。上位サロゲート (U+D800〜U+DBFF) と下位サロゲート (U+DC00〜U+DFFF) の 2 つの 16 ビットコードユニットを組み合わせて 1 文字を表します。
絵文字の多くは BMP 外に配置されているため、サロゲートペアで表現されます。JavaScript の String.length はサロゲートペアを 2 としてカウントするため、絵文字を含むテキストの文字数が実際より多く表示されます。JavaScript 絵文字処理の書籍で正確なカウント方法を学べます。
正確な文字数を得るには [...str].length や Array.from(str).length を使います。これらはサロゲートペアを 1 文字として扱います。
サロゲートペアは UTF-16 固有の概念であり、UTF-8 や UTF-32 には存在しません。文字コード詳解の書籍でサロゲートペアの技術的な詳細が解説されています。