PHP prakticky/Práce s řetězci: Porovnání verzí

Smazaný obsah Přidaný obsah
m typo
Doplněna část o vícebytových řetězcích, rozšíření mbstring + iconv
Řádek 25:
?>
</pre>
 
 
== Práce s řetězci v UTF-8 ==
 
Všechny výše uvedené funkce ve skutečnosti nepočítají znaky ale počet bytů. Pokud vaše skripty běží pouze na serveru používajícím jednobytové kódování (např. <code>windows-1250</code>), budete dostávat očekávané výsledky. Při práci s řetězci ve vícebytovém kódování ale nastává problém. UTF-8 (které je výchozím kódováním na linuxových systémech a v současné době je stále rozšířenější i na webu) ukládá různé znaky pomocí jednoho až čtyř bytů; všechny české znaky s diakritikou jsou v něm uloženy pomocí dvou bytů.
 
V PHP pro práci s vícebytovými řetězci se používají rozšíření [http://www.php.net/manual/en/book.iconv.php iconv] nebo [http://www.php.net/manual/en/book.mbstring.php mbstring]. Následující příklad ukazuje rozdílné výsledky při počítání délky řetězce.
<syntaxhighlight lang="php">
<?php
// tento skript musí být uložený jako UTF-8!
$string = 'ěščř';
 
echo 'strlen: '.strlen($string); // vypíše 8 (bytů)
echo '<br>mb_strlen: '.mb_strlen($string, 'UTF-8'); // vypíše 4
echo '<br>iconv_strlen: '.iconv_strlen($string, 'UTF-8'); // vypíše 4
?>
</syntaxhighlight>
 
Použité kódování můžete uvádět buď při každém volání těchto funkcí, anebo ho můžete nastavit jen jednou pro celý skript:
<syntaxhighlight lang="php">
<?php
mb_internal_encoding('UTF-8');
iconv_set_encoding("internal_encoding", "UTF-8");
 
echo mb_strlen('ěščř'); // vypíše 4
?>
</syntaxhighlight>
 
Výchozí kódování je možné nastavit i v konfiguračním souboru ''php.ini'' (viz PHP manuál k [http://www.php.net/manual/en/iconv.configuration.php iconv], [http://www.php.net/manual/en/mbstring.configuration.php mbstring]). Pomocí direktivy <code>mbstring.func_overload</code> se dá nastavit i to, aby se jednobytové funkce chovaly jako jejich protějšky z rozšíření ''mbstring'', tedy aby počítaly znaky místo bytů. Tato možnost je ale nestandardní, velmi málo používaná a na většině hostingů je proto vypnutá.
 
== Kombinace všech předchozích funkcí ==