It’s not wrong that "\u{1F926}\u{1F3FC}\u200D\u2642\uFE0F".length == 7 (2019)
В JavaScript "🤦🏼♂️".length == 7
— не ошибка, а результат подсчёта UTF-16 кодовых единиц.
Эмодзи состоит из 5 скалярных значений Unicode, но в UTF-16 они занимают 7 code units:
- 🤦 U+1F926 → 2
- 🏼 U+1F3FC → 2
- ZWJ U+200D → 1
- ♂ U+2642 → 1
- VAR-16 U+FE0F → 1
Итого 7 — именно это и возвращает .length
.
Другие языки считают по-своему:
- Python 3 →
len("🤦🏼♂️") == 5
(кодовые точки, но допускает суррогаты). - Rust →
"🤦🏼♂️".len() == 17
(байты UTF-8). - Swift →
"🤦🏼♂️".count == 1
(расширенный графем-кластер).
Каждый подход отвечает на свой вопрос: «сколько code units / bytes / графем». Ни один не универсален; выбор зависит от задачи.