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