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

PHP

Práca 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().

$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().

$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.

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.

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ú.

https://www.mldgroup.com

Vyštudovaný top manažér pôsobiaci najmä ako manažér, marketér, softvérový inžinier, konzultant, bloger, YouTuber a zatiaľ neúspešný hudobník a producent. V rámci praxe pôsobil v rôznych odvetviach na rôznych pozíciách v malých aj veľkých firmách, vrátane spoluprác a partnerstiev s významnými firmami či poradenskými spoločnosťami.

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená.