×
COOKIES
Prezeraním tejto stránky dochádza k spracovaniu cookies. Spracovaniu cookies zabránite v nastaveniach internetového prehliadača alebo nezobrazovaním tejto stránky v internetovom prehliadači.
Creating solutions

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
No part of this article may be reproduced without mention of the author and URL to this website.
For more information, see the About section.

Comments

Article has no comments.

Add a comment

Name (required)
Website
Message (required)
Submit
From latest