×
Vytvárame riešenia

Ako správne zistiť veľkosť reťazca v jazyku PHP

Práca sa so slovenskou znakovou sadou ako aj ďalšími znakovými sadami, ktorých znaky nezodpovedajú znakom ASCII, je v jazyku PHP asi najčastejším problémom. Výnimkou nie je ani tak jednoduchá operácia, akou je zistenie počtu znakov v reťazci.
Pre zistenie počtu znakov v reťazci slúži funkcia strlen(). No pri použití reťazca napríklad so znakmi slovenskej abecedy dochádza k nesprávnemu výsledku. Dôvodom je spôsob spracovania znakov, ktorý vracia počet bajtov a nie znakov. Od 128 znaku sú znaky kódované v UTF-8 do 2, 3 alebo 4 bajtov. Závisí od pozície znaku.
Príklad: Neodporúčaný postup pre zistenie počtu znakov cez funkciu strlen().
1
2
3
4
$text = "časť";
$length = strlen($text);
echo $length; // 6
Výsledkom príkladu je číslo 6 namiesto čísla 4. Dôvodom je uloženie znakov č a ť do 4 bajtov, teda pre každý znak 2 bajty, keďže znaky č a ť sú v rozsahu 0080 až 07FF. Znaky a a s sú v rozsahu 0000 až 007F a preto sú kódované do jedného bajtu. Výsledkom funkcie strlen() je súčet bajtov argumentu (2 + 1 + 1 + 2).
Pre správnu prácu so znakmi od 0080 je potrebné v PHP používať funkcie typu multibyte. V našom prípade je potrebné namiesto funkcie strlen() použiť funkciu mb_strlen(). Funkcia má dva argumenty. Prvým argumentom je reťazec, ktorý má byť spracovaný. Druhým argumentom je znaková sada, ktorá bude použitá.
Príklad: Odporúčaný postup pre zistenie počtu znakov cez funkciu mb_strlen().
1
2
3
4
$text = "časť";
$length = mb_strlen($text, "utf-8");
echo $length; // 4
Po použití funkcie mb_strlen() je vrátený počet znakov reťazca už správny. Ak chce používateľ pracovať so štandardnými funkciami PHP určenými pre reťazce, môže v súbore php.ini nastaviť nasledujúce direktívy.
Príklad: Nastavenie podpory UTF-8 v PHP v súbore php.ini.
1
2
3
mbstring.internal_encoding = utf-8
mbstring.func_overload = 7
mbstring.encoding_translation = On
Tieto direktívy nie je možné nastaviť cez funkciu ini_set(). Žiaľ v mojom prípade nie je možné konfigurovať súbor php.ini a nepomáha ani konfigurácia súboru .htaccess a tak som odkázaný na knižnicu Multibyte String.
Príklad: Alternatívny zápis direktív zo súboru php.ini v súbore .htaccess.
1
2
3
php_value mbstring.internal_encoding "utf-8"
php_value mbstring.func_overload 7
php_value mbstring.encoding_translation On

Záver

Práca so znakovými sadami Unicode je v jazyku PHP špecifická. Pre tieto účely má PHP k dispozícii funkcie typu multibyte, ktoré ale ešte stále nie sú dokonalé. Nová verzia PHP 6 by už mala mať podporu Unicode zlepšenú.
Autor: Matej Lednár
Dátum: 23.2.2013
Kategória: PHP
Značky: utf-8, programovanie, php, strlen, mb_strlen, multibyte, unicode


PHP,utf-8,programovanie,PHP,strlen,mb_strlen,multibyte,unicode
Žiadna časť tohto článku nesmie byť reprodukovaná bez uvedenia autora a URL na túto stránku.
Viac informácií nájdete v sekcii O projekte.

Komentáre

Článok neobsahuje zatiaľ žiadne komentáre.

Pridať komentár

Meno (povinné)
Web
Správa (povinné)
Odoslať
Od najnovších