Слово «символ» неоднозначно в Unicode. Человек видит графему, протокол может считать кодовые точки или байты UTF-8, а JavaScript использует единицы UTF-16. WordCount показывает все четыре метрики.
Графемы следуют видимому тексту
Буква с комбинируемым ударением содержит две кодовые точки, но одну графему. Семейный emoji соединяет несколько emoji невидимыми соединителями и обычно считается одной графемой. Такая сегментация подходит для видимых лимитов, но целевая система может использовать другое правило.
Кодовые точки задают значения Unicode
Итерация Unicode считает кодовые точки, а не обязательно видимые символы. Селекторы варианта, модификаторы тона кожи и соединители — отдельные точки, хотя формируют одну видимую группу. Используйте эту метрику, только если контракт прямо говорит о кодовых точках.
JavaScript length считает единицы UTF-16
Большинству букв нужна одна единица UTF-16, а точке вне основной плоскости — суррогатная пара, то есть две. Длина строки точна для семантики JavaScript, но как число видимых символов она удивляет на emoji.