BMP
Basic Multilingual Plane
Unicodeの「面(Plane)」構造
Unicodeは全体を17個の「面」に区切っていて、各面は65,536文字(U+0000〜U+FFFF分)。
table:_
面 範囲 名前 内容
Plane 0 U+0000〜U+FFFF BMP (Basic Multilingual Plane) 日常で使うほぼ全部(英数字、ひらがな、漢字の大部分、ハングル等)
Plane 1 U+10000〜U+1FFFF SMP (Supplementary Multilingual Plane) 絵文字、古代文字、楽譜記号など
Plane 2 U+20000〜U+2FFFF SIP (Supplementary Ideographic Plane) 拡張漢字(𠮟、𩸽 などの拡張漢字)
Plane 3〜13 未割当 or 専門用途
Plane 14 U+E0000〜U+EFFFF SSP 言語タグなど
Plane 15〜16 PUA (私用領域) アプリ独自の文字
なぜ「BMP」という名前か
Unicodeが最初に策定された時は 16bit(= BMPだけ)で世界中の文字を収めるつもりだった
だから「Basic(基本)」。
ところが「やっぱ足りない」となって拡張したのが Plane 1以降の Supplementary(補助) 面
この補助面の文字をUTF-16で扱うために、苦肉の策として作られたのがサロゲートペア。
実用的に覚えておくと便利な境界
U+FFFF まで → JSの \uXXXX 1個で書ける、.length が1
U+10000 以降 → サロゲートペアが必要、.length が2になる
code:js
"あ".length // 1 (BMP内)
"𠮟".length // 2 (BMP外、拡張漢字)
"😀".length // 2 (BMP外、絵文字)
..."😀".length // 1 (イテレータはコードポイント単位)
String.prototype.length が「文字数」と一致しないのは、これが理由。