Rozsypały się literki z unikodu, a kotek jeszcze by chciał

Rozsypały się literki z unikodu, a kotek jeszcze by chciał

W interneciku na serwerku,
Stała stronka i contencik.
Przyszedł substr, ciachnął tekścik,
A ogonkiem spsuł unikodzik..

W projekcie, nagle, w nieprzewidzianym miejscu rozsypał się UTF-8. Na jednej podstronie, choć pozostałe generowane z tego samego szablonu – były ok. Żeby było śmieszniej, rozwalony kod był od połowy strony, wcześniejsze krzaki w źródle były ok. Dopiero po pewnym fragmencie – były źle. W połowie strony zepsuło się UTF-8 i wyświetlały się krzaki. Ciekawostka…

Winnym okazał się substr w php. To bezhołowie nawet nie podejrzewa, że istnieje coś takiego jak unikod, proszę państwa!

Zdarzyło się tak, że substr uciął treść, zgodnie z założeniem, po 1024 znakach. Pech trafił, że substr liczył znaki zgodnie z ASCII czyli jednobajtowo, a w UTF-8 znaki spoza zakresu zajmują więcej niż jeden bajt. Eksperymentalnie sprawdziłem, że to substr jest odpowiedzialny za rozkład i zgniliznę w reszcie strony.

Zapamiętać: na unikodzie robimy mb_substr( $string, $start, $end, ‚utf-8’)