«А роза упала на лапу Азора» — классический русский палиндром: буквы читаются одинаково что слева направо, что справа налево, если убрать пробелы и не различать регистр. Для кириллического текста без диакритики простой посимвольный реверс работает безупречно — но не для всех письменностей это так же просто.
Что такое графемный кластер
То, что человек воспринимает как «один видимый символ», в Unicode иногда состоит из нескольких кодовых точек — например, эмодзи семьи (👨👩👧) — это фактически несколько отдельных эмодзи, соединённых специальным символом-соединителем (zero-width joiner). Такую комбинацию называют графемным кластером.
Почему наивный реверс всё ломает
Если перевернуть строку по отдельным кодовым точкам, а не по графемным кластерам, соединитель окажется не на своём месте, и вместо одного видимого эмодзи получится набор отдельных, несвязанных символов — часто это выглядит как «сломанные» квадратики или случайные эмодзи вместо исходного.
Корректный реверс
Правильная реализация сначала разбивает строку на графемные кластеры (учитывая соединители, модификаторы и комбинирующие символы), а уже потом меняет порядок этих кластеров, а не отдельных кодовых точек внутри них.
Зачем это нужно
- Проверить палиндром или создать текстовый эффект «зеркального» текста.
- Продемонстрировать или продиагностировать проблему с обработкой Unicode в коде.
- Развлекательные или учебные задачи, где нужен корректный реверс текста с эмодзи.
Почему кириллица почти не создаёт проблем
В отличие от письменностей с комбинируемыми диакритическими знаками, стандартная кириллица кодируется одним кодовым пунктом на видимый символ — «п», «р», «о» не распадаются на базу и модификатор. Поэтому русские палиндромы вроде приведённого выше переворачиваются посимвольно без единой ошибки, и вся сложность графемных кластеров становится актуальна только при смешивании текста с эмодзи или другими комбинируемыми письменностями.