Podczas niedawnych prac nad kursem dotyczącym integracji systemów płatności internetowych ze stroną WWW natknąłem się na wadliwe działanie funkcji htmlentities(). Problem polegał na tym, że ciągi znaków zakodowane w UTF-8 pomimo przesłania do funkcji informacji o kodowaniu, miały zamieniane litery ‘ó’ oraz ‘Ó’ na encje ‘ó’ oraz ‘Ó’. Sprawa wygląda dosyć dziwnie, bo szukając informacji o tym błędzie natknąłem się na kilka dyskusji i podobne problemy napotkali też inni programiści, ale niekoniecznie dotyczyły one tych samych liter.
Rozwiązanie problemu jest oczywiście dosyć proste. Należy encje zamienić z powrotem na odpowiedni litery. Należy przy tym pamiętać, by plik z kodem był również zakodowany w UTF-8.
<?php $value=htmlentities($value, ENT_COMPAT, 'UTF-8'); $value=str_replace(array('ó', 'Ó'), array('ó', 'Ó'), $value); ?> |
Funkcja str_replace() zamienia w zmiennej $value fragmenty z tablicy, która jest pierwszym argumentem tej funkcji na elementy tablicy, która jest argumentem drugim.
Z kolei wczoraj, konfigurując portal pewnej szkoły zauważyłem, że w pewnych miejscach polskie znaki również nie wyświetlają się poprawnie. Przeglądarka poprawnie interpretowała kodowanie strony, również w bazie danych wszystkie napisy były zapisane prawidłowo. Po bliższym przyjrzeniu się problemowi, winowajcą okazała się funkcja strtolower() zmieniająca wszystkie znaki na małe. Funkcja ta również nie radziła sobie z kodowaniem UTF-8. W tym przypadku jednak znalazł się zamiennik: funkcja mb_strtolower(). Jej użycie dla tekstów kodowanych w UTF-8 wygląda następująco
<?php $tytul=mb_strtolower($tytul, 'UTF-8'); ?> |