Wszystkie artykuły

Text Reverse: dlaczego „odwrócenie tekstu" jest trudniejsze, niż się wydaje

„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.
Wypróbuj narzędzie