Zmiana wielkości liter w PHP, a polskie znaki
Chyba wszyscy programiści PHP znają magiczne funkcje operujące na stringach:
- strtoupper($str)
- strtolower($str)
Służą one do zmiany wielkości liter w ciągu, pierwsza na duże litery, druga na małe.
Niestety funkcje te nie najlepiej radzą sobie w przypadku kodowania UTF‑8 z polskimi znakami (i nie tylko polskimi).
Próba wykonania takiego kodu:
$a="ęóąśłżźćń"; $b="ĘÓĄŚŁŻŹĆŃ"; echo strtoupper($a); echo " "; echo strtolower($b);
Daje dosyć niespodziewane rezultaty w postaci:
ęaąśłżUćń ?????????
Z pomocą przychodzą nam funkcje, które również są obecne w php, a które nie maja problemów z różnymi kodowaniami:
string mb_strtolower($str,[$encoding]) string mb_strtoupper($str,[$encoding])
Jak łatwo się domyslić jako pierwszy argument podajemy test do zmiany, a jako drugi kodowanie.
echo mb_strtoupper($a,"UTF-8"); echo " "; echo mb_strtolower($b,"UTF-8");
Teraz dostajemy poprawny wynik:
ĘÓĄŚŁŻŹĆŃ ęóąśłżźćń
Jest jeszcze jedna funkcja którą warto znać w tym temacie. Może zrobić to samo co dwie poprzednie i dodatkowo zmienić na wielkie pierwsze litery wyrazów. Jej konstrukcja jest następująca:
string mb_convert_case ($str,$mode,[$encoding])
Pierwszy argument to znowu tekst do zmiany, drugi to tryb, a trzeci kodowanie. Wyjaśnienia wymaga tryb. W tym argumencie podajemy jedną z trzech stałych:
- MB_CASE_UPPER - zmiana wszystkich liter na wielkie
- MB_CASE_LOWER - zmiana wszystkich liter na małe
- MB_CASE_TITLE - zmiana pierwszych liter w wyrazach na wielkie
Przykład użycia:
echo mb_convert_case("ęóąśłżźćń ĘÓĄŚŁŻŹĆŃ",MB_CASE_TITLE,"UTF-8");
Efekt:
Ęóąśłżźćń Ęóąśłżźćń