Jelenlegi hely

3.1.5. Karakterkódolás: Használjunk mindenhol UTF-8-at

Mivel a magyar nyelv használata weboldalak készítésénél nem triviális, érdemes bevezetőként ezzel a témával is foglalkoznunk.

Mivel ma, 2011-ben az UTF-8 karakterkódolás egyre dominánsabbnak (bár közel sem problémamentesnek) tekinthető, érdemes egyre inkább megismerni, még ha a korlátaival is kell még szembesülnünk.

Hodicska Gergely 2006-os nagyszerű cikke Karakterkódolási problémák kiküszöbölése címmel még nem az UTF-8-ról szól, de az alapelvek miatt mindenképpen érdemes elolvasni.

Bevezetőként még érdemes azt elmondani, hogy a PHP jelenlegi legfrissebb (5.3.x) verziója sem kezeli jól az UTF-8 kérdést. Ha azonban követjük a következő alapelveket, többnyire kézben tarthatjuk a problémát.

Konfigurációs állományok

A httpd.conf-hoz adjuk hozzá:

AddDefaultCharset UTF-8

A php.ini-hez adjuk hozzá:

default_charset = "utf-8"

A my.ini-hez adjuk hozzá:

[client]
default-character-set=utf8

[mysqld]
character-set-server=utf8
default-character-set=utf8
default-collation=utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-client = utf8

Minden szerver alkalmazást (szolgáltatást) indítsunk újra, és már használhatjuk is.

HTML, PHP forráskód mentése

A forráskód készítésekor az editorunkkal tudatnunk kell, hogy milyen karakterkódolással kell elmentenie az állományt. Ez Komodo Edit esetén két módon tehetjük meg:
Az Edit / Preferences / Internationalization / Custom encoding étréke legyen UTF-8. Ez minden további állomány alapértelmezése lesz.

UTF-8 alapértelmezett beállítása Komodo Edit esetén

Ha egy megnyitott állományt, akarunk UTF-8 kódolással menteni, akkor az Edit / Current File Settings / Properties / Encoding értékét állítsuk UTF-8-ra, BOM (byte order mark) nélkül, és mentsük az állományt.

„Egyes Windows-os programok a fájl elejére írt 0xEF,0xBB,0xBF bájtsorozattal jelzik, hogy UTF-8 kódolású fájlról van szó; ezt néha UTF-8 BOM kódolásnak hívják. […] UTF-8-ban ennek a karakternek elméletileg nincs jelentése, így használható a kódolás jelzésére, azonban ez megtöri az ASCII-kompatibilitást, így nem javasolt. Az így kódolt PHP fájlok például a weboldal elején megjelenő karaktersorozatot eredményeznek.” Forrás: Wikipédia

Ha azt akarjuk, hogy a böngésző UTF-8-ként dolgozza fel a választ, a korábban már látott meta tagot használhatjuk:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

Ennél még jobb megoldás, ha a forráskód legelején, még a doctype és a html tag előtt kiküldjük a következő header függvényt:

<?php
  header
('Content-Type: text/html; charset=utf-8');
?>
<!DOCTYPE html>

Problémák a sztringek kezelésével

Ha UTF-8 kódolást használunk, a hagyományos karakter-kezelési funkciók (pl. az indexelés) nem megfelelően fognak működni. De gondban leszünk az strlen, strtoupper, strpos és hasonló függvényekkel is. Jelenleg megoldást kiegészítők formájában találhatunk.

Pl. a Multibyte String használata esetén az mb_strlen és hasonló függvényeket kell használnunk. Emellett egyre inkább elterjedő megoldásnak tűnik az iconv.

FTP feltöltés

Arról sem érdemes megfeledkeznünk, hogy érdemes az állományainknál garantálni, hogy az FTP feltöltés során se változzon semmi a forráskódunkban. Ezért az FTP alkalmazásunkat érdemes úgy beállítani, hogy az bináris módban töltse fel az állományokat.

Total Commander esetén a Beálltások / Általános beállítások / Működés / FTP / Alapértelmezett átviteli mód a Bináris legyen.

Ezekkel a beállításokkal az UTF-8 kódolás többnyire elérhető.

Adatbázis-kapcsolat

Adatbázis-használat esetén az adatbázis létrehozása és a PHP-MySQL kommunikáció során is érdemes beállítani az utf-8-at.