«Перевернути текст» звучить як найпростіша можлива операція — просто виведи символи у зворотному порядку. Але наївна реалізація по кодових точках Unicode ламається на емодзі, символах з діакритикою та деяких інших не-латинських текстах.
Що таке графемний кластер
Те, що людина сприймає як «один видимий символ», у Unicode іноді складається з кількох кодових точок — наприклад, емодзі родини (👨👩👧) — це фактично кілька окремих емодзі, з’єднаних спеціальним символом-з’єднувачем (zero-width joiner). Таку комбінацію називають графемним кластером.
Чому наївний реверс усе ламає
Якщо перевернути рядок по окремих кодових точках, а не по графемних кластерах, з’єднувач опиниться не на своєму місці, і замість одного видимого емодзі вийде набір окремих, непов’язаних символів — часто це виглядає як «зламані» квадратики чи випадкові емодзі замість початкового.
Коректний реверс
Правильна реалізація спершу розбиває рядок на графемні кластери (враховуючи з’єднувачі, модифікатори та комбінувальні символи), а вже потім змінює порядок цих кластерів, а не окремих кодових точок усередині них.
Навіщо це потрібно
- Перевірити паліндром чи створити текстовий ефект «дзеркального» тексту.
- Продемонструвати або продіагностувати проблему з обробкою Unicode в коді.
- Розважальні чи навчальні задачі, де потрібен коректний реверс тексту з емодзі.
Комбінувальні діакритичні знаки
Символ «é», записаний як базова літера «e» плюс окремий комбінувальний акутовий наголос, — це два кодових точки, пов’язані порядком: наголос завжди йде одразу після символу, до якого стосується. Наївний реверс по кодових точках поміняє їх місцями, і наголос «відклеїться» від своєї літери та прикріпиться до сусідньої — коректний реверс має тримати базовий символ і його комбінувальні знаки разом як одну одиницю.