created: 2020-10-13T05:38:36.000Z

Unicodeスカラー値と、対になっていないサロゲートコードポイントについてメモ

この文章がよく分からなかったので単語について調べたときのメモ

USVString - Web API | MDN

USVString は、Unicode スカラー値(unicode scalar values)のすべての可能なシーケンスの集合に対応します。 USVString は、JavaScript で返されると String にマップされます。 通常、テキスト処理を実行し、操作するために Unicode スカラー値の文字列が必要な API にのみ使用されます。 USVString は、対になっていないサロゲートコードポイント(surrogate codepoints)を許可しないこと以外は DOMString と同じです。 USVString にある対になっていないサロゲートコードポイントは、ブラウザーによって Unicode の置換文字(replacement character)U+FFFD (�) に変換されます。

Unicode スカラー値

Unicodeはコードポイントの定義の集合で、それぞれのコードポイントを U+10FFFF といったリテラルで表すこと

文字セットは16進数にU+をつけて U+0000~U+10FFFF で表します。これをUnicodeスカラ値といいます。

$ node -p '"\u{1F466}"'
👦
$ node -p '"\u{1F466}\u{1F3FE}"'
👦🏾

U+4E00 といった表現はutf8など、エンコーディングの世界の表記ではなく文字集合であるUnicodeの世界の表現である。このリテラルはUnicodeの符号位置を示すためのものである。jsで使える \u{1F466} といったリテラルは符号位置をASCIIで入力したものである。

対になっていないサロゲートコードポイント

文字を示すバイト列として不完全になっているもののことを言っている

まずサロゲートペアについて

まずUnicodeは符号位置の集合であり、UTF-8・UTF-16・UTF-32 といったUnicodeに対応するエンコーディングは文字をどんなバイト列で表現するかの規格である。符号位置はコードポイントとも呼ばれる。

Unicodeには、16ビットすなわち65,536の符号位置を持つ面(plane)が17面あり、合計100万あまりの符号位置を持ちます。符号位置は「U+4E00」のように接頭辞「U+」を付けた4〜6桁の16進数で表記します。

17面あるうち、最初の面00が基本多言語面(BMP、Basic Multilingual Plane)であり、日常的に用いる文字の大半がここに収められています。

UTF-16ではBMPの範囲外の文字列は16ビットで表さずに32ビットを使う。そしてJavaScriptでは文字列はUTF-16である。

JavaScript の文字列 は、UTF-16 でエンコードされた文字列です。

この32ビットで1文字をあらわすための仕組みがサロゲートペアである。

次にサロゲートコードポイントについて

サロゲートペアの1文字目のこと。サロゲートペアを表現するときの片側のバイトが指す符号位置のこと。U+D800 ~ U+DFFFがそれにあたり、16ビット配下だがこの範囲にはBMPに文字が収録されていない。

BMP以外のU+10000..U+10FFFFは、表のようにビットを配分して、符号単位2つで表す。

このとき使われる、U+D800 ~ U+DFFF の符号位置を、代用符号位置(Surrogate Code Point)と呼び、BMP外の1つの符号位置を表す連続した2つの代用符号位置のペアをサロゲートペアと呼ぶ。代用符号位置に使うため、BMPのこの領域には文字が収録されておらず、UTF-16以外のUTF-8、UTF-32では使用されない。