GAJDAW


MOJE KSIĄŻKI

Książka pt. Git. Recipes
Książka pt. Git. Rozproszony system kontroli wersji
Książka pt. PhpStorm Starter
Książka pt. Symfony w przykładach
Książka pt. GIMP. Praktyczne projekty. Wydanie II
Książka pt. PHP, MySQL i MVC. Tworzenie witryn WWW opartych na bazie danych
Książka pt. PHP. Praktyczne projekty

PROGRAMY

Porada: przetwarzanie napisów utf-8 znak po znaku

Włodzimierz Gajda

Napisy w PHP są tablicami. Możemy przetwarzać znak po znaku. Dostęp do i-tej litery napisu $n uzyskujemy $n[$i]. Jeśli jednak napis jest zakodowany w utf, to takie rozwiązanie nie działa. Porada wyjaśnia jak to zrobić.

1. Kodowanie utf-8 oraz mb_string

Kodowanie utf-8 jest kodowaniem wielobajtowym. Pojedynczej literze odpowiada od 1 do 6 bajtów (zależnie od litery).

Do przetwarzania napisów o kodowaniu wielobajtowym służą funkcje z rodziny Multibyte Strings. Mają one przedrostek mb_ i są opisane w dokumentacji, w rozdziale pt. Multibyte String.

2. Konfiguracja

Funkcje mb_ będą dostępne dopiero wtedy, gdy w pliku php.ini dołączymy odpowiednie rozszerzenie:

extension=php_mbstring.dll

Zwykle rozszerzenie php_mbstring.dll włączam jako pierwsze:

;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;

extension=php_mbstring.dll
extension=php_bz2.dll
extension=php_curl.dll
extension=php_exif.dll
extension=php_gd2.dll
...

3. Przetwarzanie napisu kodowanego utf-8

Jeśli w skrypcie PHP umieścisz napis:

$ogonki = 'ąćęłńóśźżĄĆĘŁŃÓŚŹŻ';

a plik zakodujesz w utf-8, to pętla przetwarzająca napis litera po literze:

$dl = strlen($ogonki);
for ($i = 0; $i < $dl; $i++) {
    echo $ogonki[$i] . '<br />';
}

będzie błędna. Funkcja strlen() zwróci liczbę bajtów a nie liter. echo będzie drukowało poszczególne bajty, a nie litery.

W miejsce strlen() należy użyć mb_strlen(), zaś i-tą literę uzyskamy wywołując funkcję mb_substr():

$ogonki = 'ąćęłńóśźżĄĆĘŁŃÓŚŹŻ';

$liczbaliter = mb_strlen($ogonki);

for($i = 0; $i < $liczbaliter; $i++) {
    echo mb_substr($ogonki, $i, 1) . '<br />';
}
lp. Przykład
1. Drukowanie tabeli polskich ogonków w utf-8

Tabela 1. Przykłady do pobrania

lp. Adres
1. Dokumentacja PHP: Multibyte String

Tabela 2. Adresy


Reklama

Szkolenia z Zend Framework 2.0