Кодовая точка — числовая позиция в пространстве Unicode. Значение Unicode — любая точка кроме суррогатного диапазона U+D800–U+DFFF. UTF-16 состоит из 16-битных единиц, поэтому одно значение не всегда занимает одну позицию строки JavaScript. Разделение этих понятий предотвращает неверные счётчики и ошибки обхода.

Значения BMP занимают одну единицу UTF-16

Большинство распространённых письменностей и символов находится в Basic Multilingual Plane. Значение U+0000–U+D7FF или U+E000–U+FFFF представляется одной единицей UTF-16 с тем же hex. Промежуток D800–DFFF зарезервирован для пар, а не самостоятельных символов. UnicodeLens принимает допустимые BMP-значения, включая управляющие и private-use, но не присваивает им имена или смысл.

Дополнительные значения образуют суррогатную пару

Для значения U+10000 и выше UTF-16 вычитает 0x10000 и распределяет биты между старшим и младшим суррогатом. Emoji 😀 — U+1F600, а его единицы UTF-16 — D83D DE00. Поэтому JavaScript даёт длину строки два. UnicodeLens показывает одну строку scalar, две единицы UTF-16 и четыре байта UTF-8, явно называя каждую меру.

Одиночный суррогат не является значением Unicode

Старший суррогат без следующего младшего или младший без старшего образует неверный UTF-16. Некоторые API незаметно заменяют такой ввод, скрывая дефект. UnicodeLens останавливается на позиции единицы UTF-16 и очищает старый результат. Режим декодирования также отклоняет U+D800–U+DFFF: это суррогатные точки, которые не могут самостоятельно стать текстом UTF-8.