„Kajak" to klasyczny polski palindrom — czytany od przodu i od tyłu daje ten sam wynik. Odwracanie polskiego tekstu znak po znaku, nawet z literami ą, ę, ł czy ż, zwykle działa bez zarzutu, bo każda z nich to pojedynczy punkt kodowy Unicode. Problemy zaczynają się gdzie indziej — na poziomie kodowania i przy tekstach mieszanych z emoji.
Punkt kodowy a bajt
Polskie znaki diakrytyczne zajmują w UTF-8 więcej niż jeden bajt. Naiwna implementacja, która odwraca ciąg na poziomie surowych bajtów zamiast punktów kodowych Unicode, rozbija wielobajtowy znak na pojedyncze bajty i odwraca je osobno. Efektem jest nieprawidłowa sekwencja bajtów, która przy renderowaniu pokazuje się jako � albo inny „zepsuty" znak zamiast po prostu przesuniętej litery.
Czym jest klaster graficzny
To, co człowiek postrzega jako „jeden widoczny znak", w Unicode czasem składa się z kilku punktów kodowych — emoji rodziny (👨👩👧) to w rzeczywistości kilka osobnych emoji połączonych specjalnym znakiem łączącym o zerowej szerokości. Taką kombinację nazywa się klastrem graficznym.
Dlaczego naiwne odwracanie wszystko psuje
Jeśli odwrócić ciąg według pojedynczych punktów kodowych, a nie klastrów graficznych, łącznik trafia w złe miejsce, a zamiast jednego widocznego emoji powstaje zestaw osobnych, niepowiązanych znaków — często wyglądających jak „zepsute" kwadraty albo przypadkowe emoji zamiast oryginału.
Poprawne odwracanie
Właściwa implementacja pracuje na punktach kodowych (nie na bajtach), dodatkowo dzieli ciąg na klastry graficzne, uwzględniając łączniki, modyfikatory i znaki łączące, a dopiero potem odwraca kolejność tych klastrów — nie pojedynczych punktów kodowych w ich wnętrzu.
Do czego to się przydaje
- Sprawdzenie palindromu, takiego jak „kajak", albo stworzenie efektu tekstu „lustrzanego".
- Zademonstrowanie lub zdiagnozowanie błędu obsługi Unicode w kodzie.
- Zadania rozrywkowe lub edukacyjne wymagające poprawnego odwrócenia tekstu z emoji.