Intl.Segmenter: разбиение текста на графемы
Intl.Segmenter помогает разбивать строку на единицы, соответствующие языковому представлению текста. Режим grapheme полезен, когда видимый символ состоит из нескольких кодовых точек.
Назначение
Intl.Segmenter помогает разбивать строку на единицы, соответствующие языковому представлению текста. Режим grapheme полезен, когда видимый символ состоит из нескольких кодовых точек.
Как это работает
Segment возвращает итерируемый набор сегментов. Длина строки JavaScript считает кодовые единицы UTF-16, а не такие сегменты. В примере буква е и комбинируемый знак «две точки сверху» образуют одну графему.
Пример
const text = "е" + String.fromCodePoint(0x0308);
const segmenter = new Intl.Segmenter("ru", {granularity:"grapheme"});
const parts = [...segmenter.segment(text)].map(item => item.segment);
console.assert(text.length === 2);
console.assert(parts.length === 1);
console.assert(parts.join("") === text);
console.log(parts);
Что должно получиться
Length равен 2, а список графем содержит один элемент. Обратное объединение сохраняет исходную последовательность без обязательной нормализации текста.
Граница применения и частая ошибка
Разбиение зависит от правил Unicode и данных среды, поэтому проверяйте поддержку целевых браузеров. Графема не равна байту или гарантированной ширине на экране. Для лимита серверного поля сначала уточните, в каких единицах он задан.
Самостоятельная проверка
Добавьте эмодзи с модификатором и сравните length, перебор строки и Segmenter. Проверьте обратную сборку. Для обрезки пользовательского текста используйте границы сегментов, а не произвольный индекс кодовой единицы.
Пример JavaScript проверяйте в собственном учебном файле или консоли своего проекта. Встроенная песочница справочника JavaScript не выполняет. Успешное выполнение в одной среде не гарантирует поддержку метода во всех браузерах.