Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

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 "<br />"; 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 "<br />"; 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:

Ęóąśłżźćń Ęóąśłżźćń 

porady programowanie

Komentarze

0 nowych
kubut   17 #1 06.03.2012 19:55

Leci do zakładek, przydatne rady. Do tej pory używałem nieświadomie strtolower :/

  #2 06.03.2012 20:12

Warto najpierw sprawdzać, czy funkcje mb_* są w ogóle dostępne, bo nie na każdym hoście to jest.

  #3 06.03.2012 20:13

tez niedawno z tym walczyłem w jakiejs aplikacji i znalazlem ta funkcje

kwpolska   5 #4 06.03.2012 20:55

oczywiscie PHP musi miec takie problemy.

slepciu   10 #5 06.03.2012 21:07

@lukasamd
Masz rację, nie pomyślałem żeby o tym napisać.

command-dos   17 #6 07.03.2012 06:40

@kwpolska - nie tylko PHP, programowałeś kiedyś?
@slepcu - lubię Twoje wpisy, choć z programowaniem rozstałem się jakieś kilka, może nieco więcej, lat temu... Kto wie, może wiedza znowu się przyda ;)

slepciu   10 #7 07.03.2012 10:03

@command-dos - dzięki, miło to czytać :)

slepciu   10 #8 07.03.2012 10:20

@an.szop - racja, bez odpowiedniego kodowania pliku i deklaracji w HTML będziemy mieli krzaczki nawet bez używania tych funkcji.

  #9 11.03.2012 00:28

Z czysto "purystycznego" obowiązku wspomnę tylko, że to:

mb_convert_case ($str,$mode,[$encoding])

Jest definicją funkcji (chociaż przydałby się także typ zwracany, jest on co prawda oczywisty w tym wypadku), a nie jej "konstruktorem".

Pozdrawiam.

slepciu   10 #10 11.03.2012 22:10

@Killavus_ (niezalogowany) - masz absolutną rację, funkcja to nie klasa, żeby miała konstruktor. To była z mojej strony pomyłka, zamiast "konstruktor" miałem napisać "konstrukcja", ale coś mnie musiało zamroczyć :) Dzięki za zwrócenie uwagi - poprawiłem błąd i za Twoją sugestią dodałem zwracany typ

  #11 12.03.2012 00:48

Tak mi spracowało... Nie wiesz może dlaczego na niektórych stronach w operze tekst zmienia swoją czcionkę jeśli pojawia się polski znak? Czasem tak mi wyświetla strony że słowo w połowie zmienia czcionkę od momentu pojawienia się polskiego znaku i ta zmienilna czcionka odpuszcza na końcu wyrazu i wraca do normalnej. Następnie aż znowu nie pojawi się polski znak czcionka się zmienia i trwa do konca wyrazu. Nie wiem od czego to zależy i pod jakimi hasłami szukać ale może ma to związek z powyższym tekstem? Stąd moje pytanie.

slepciu   10 #12 12.03.2012 09:58

@prz (niezalogowany) -nigdy mi się coś takiego nie przytrafiło. Na pewno to o czym tutaj piszę nie ma na to wpływu, bo to dzieję się po stronie serwera, a to co opisujesz raczej po stronie przeglądarki. Może masz jakieś braki w czcionkach. Sprawdź te same strony na innym kompie w Operze. A jak będziesz miał nadal problem to najlepiej napisz na forum, tam więcej ludzi to zobaczy, może ktoś miał podobny problem

bjonczy   3 #13 12.03.2012 11:39

@lukasamd
Generalnie, php musi mieć zainstalowane rozszerzenie mbstring.

Hilarion   5 #14 12.03.2012 19:02

@prz:
Z tego, co mi wiadomo, taki efekt występuje gdy czcionka użyta w danym miejscu strony WWW nie obsługuje (według przeglądarki) danego znaku - wtedy przeglądarka zmienia czcionkę na taką, która taki znak obsługuje (zwykle w ustawieniach przeglądarki można wybrać czcionki dla zestawów znaków, ale przeglądarka raczej najpierw posłuży się alternatywnymi czcionkami wskazanymi w CSS strony, a dopiero w ostateczności użyje skonfigurowanych).
Jeśli problem dotyczy strony, którą sam stworzyłeś, to sprawdź, czy wybrane przez Ciebie czcionki obejmują środkowoeuropejski zestaw znaków, ew. sprawdź co się stanie, jeśli użyjesz jednej z popularniejszych czcionek (Arial, Helvetica, Verdana, Times New Roman). Problem może również być spowodowany efektywnym nie wyspecyfikowaniem żadnej czcionki i w konsekwencji użyciem przez przeglądarkę czcionki domyślnej (z ustawień przeglądarki), która nie obsługuje wspomnianych znaków.

Oczywiście - jak zwykle - mogę się całkowicie mylić, więc zachęcam do sprostowań czy polemiki, ale przede wszystkim do własnych eksperymentów i poszukiwań w tym zakresie.

Z góry przepraszam też za błędy gramatyczne i inne błędy językowe (wiem, że mierny ze mnie polonista) i chętnie przyjmę uwagi i krytykę również w tym zakresie.

  #15 03.06.2014 13:47

Wiem ze troche nie na temat ale czesto potrzebuje zamienic wielkosc liter z poziomu strony online, bez koniecznosci instalacji programow, mozna to zrobic na http://skryptyonline.pl/zamiana_wielkosci_liter Wklejasz tekst, klikasz wykonaj i gotowe, moze sie przyda

  #16 28.12.2014 10:57

"substr" też gubi polskie znaki. masz rozwiązanie na to?

slepciu   10 #17 28.12.2014 15:50

@Diablyx (niezalogowany): To powinno pomóc: mb_substr: http://php.net/manual/en/function.mb-substr.php