UTF-8, MySQL, kódování a PHP funkce pro práci s řetězci: strlen, substr aj.
Možná jste při práci s PHP narazili na problém s UTF-8 kódováním. Doposud jste využívali kódování cp1250 nebo iso-8859-2 a nebyl problém. Okolnosti vás přinutily požívat UTF-8 a najednou bum. Na stránkách se vám chybně vypisují znaky s českou diakritikou a nevíte co s tím.
Jak správně použít UTF-8 a MySQL?
Je třeba dodržet následující pravidla:
- Po připojení nastavit kódování, ve kterém bude probíhat komunikace s databázovým serverem:
mysql_query("SET NAMES 'utf8'"); nebo mysql_query('SET CHARACTER SET utf8'); Od PHP 5.2.3 a MySQL 5.0.7 raději použijte: mysql_set_charset('utf8'); Je to správná a bezpečná varianta pro použití mysql_real_escape_string(). Více: 1, 2, 3.
- Kódování PHP souborů nastavit na UTF-8 (pozor na počáteční UTF-8 boom znak)
- Odesílat hlavičky s UTF-8 kódováním:
header('Content-Type: text/html; charset=utf-8');
- Nastavit UTF-8 kódování v HTML (meta tagy, xml hlavička aj.)
- Používat PHP řetězcové funkce, které zvládají UTF-8 (viz dále)
PHP funkce a podpora UTF-8
Všechno výše jste nastavili a teď chcete vypsat následující:
echo strlen('Zdeněk Večeřa');
Asi očekáváte „13“ (znaků), ale pravdu byste neměli. Vypíše se „16“. Důvod je, že funkce strlen() není „UTF-8 friendly“, a má tedy v tomto případě problém se znaky s diakritikou. Naštěstí existují alternativní funkce, které si poradí s mnoha kódovaními, vč. UTF-8. Ve jméně funkcí je prefix mb_, takže výše uvedený příklad by vypadal takto:
echo mb_strlen('Zdeněk Večeřa');
Když funkci provedete, vypíše se opět „16“. Kde je problém? Chybou je špatně nastavené kódování. Nastavíte ho takto:
echo mb_strlen('Zdeněk Večeřa', 'UTF-8');
Výše uvedený příklad už vypíše správně „13“.
Alternativy s prefixem na začátku existují pro všechny významné PHP funkce, které pracují s řetězci. Nevýhodou může být (nutnost) uvádět kódování.
Nastavení výchozího kódování pro mb_ funkce
PHP umožňuje nastavit výchozí kódování, které se použije pro všechny mb_ funkce:
mb_internal_encoding('UTF-8');
Zjistit aktuálně nastavené kódování můžete takto:
echo mb_internal_encoding();
Poté už lze bez problému použít:
echo mb_strlen('Zdeněk Večeřa');
UTF-8, preg_replace() a česká diakritika
Pokud v regulárních výrazech pracujete s českou diakritikou, je třeba přidat parametr u:
$search = 'šimáček'; $text = 'Dobrý den, přeji jen. Šimáček'; echo preg_replace('/(' . $search . ')/iu', '\\1', $text);
Výše uvedený kód zvýrazní slovo „Šimáček“:
Dobrý den, přeji jen. Šimáček.
Kdybychom nepoužili parametr u, slovo by se nezvýraznilo (kvůli odlišné velikosti prvního písmene š/Š).
Comments ( 9 )