Utf-8

Utf-8

Rövid összefoglaló, hogy mikor, mire érdemes figyelni a karakterkódolással kapcsolatban.

Ma már alapértelmezett, hogy honlapkészítéshez Utf-8-as kódolást használunk mindenhol. Valamikor az ezredforduló környékén az átállásról szóló cikkek még kuriózumnak számítottak. Ma viszont az a meglepő, ha valaki mégsem Utf-8-as kódolást használ. Ám mégis, előfordul, hogy egy-egy kezdő fejlesztő belefut olyan problémába, hogy nem megfelelően jelenik meg a honlapján a szöveg. Emiatt egy rövid összefoglalót készítettem, melyben összeszedtem, hogy hol, mit érdemes beállítani a helyes karakterkódoláshoz.

Nulladik lépésként meg kell említeni, hogy a fájlok, amelyekkel dolgozunk, legyenek Utf-8-as kódolásúak! Banális hiba, ám mégis a legtöbbször itt szokott elvérezni a kezdő fejlesztő. Itt egy olyan hiba is előfordulhat, hogy az úgynevezett Utf-8 BOM kódolást adunk meg, amelynek a lényege, hogy az adott fájl első pár byte-ja tartalmazza a kódolás típusát. Ez felesleges, illetve több esetben hibához is vezethet, így ennek használata kerülendő. A BOM-ról részletesebben az alábbi Wikipédia oldalon olvashatsz: https://en.wikipedia.org/wiki/Byte_order_mark

Apache

Amennyiben az Apache alapértelmezetten nem Utf-8-as kódolást használna, akkor a .htaccess fájlba az alábbi utasításokat tehetjük be, hogy a szerver a kéréseket mégiscsak ennek megfelelően szolgálja ki.

AddDefaultCharset utf-8
<IfModule mod_mime.c>
    AddCharset utf-8 .js
    AddCharset utf-8 .css
</IfModule>

HTML

Ugyanúgy, ahogy ma már nem érdemes nem Utf-8-as kódolást használni, nem érdemes nem HTML5-öt használni. A HTML5-ben alapértelmezett kódolás Utf-8, ennek ellenére a legtöbb fejlesztő beleteszi a forrásba a karakterkódolást.

<!DOCTYPE html><html><head>

<meta charset="utf-8">

CSS

Nem sűrűn írok a .css fájlokba kommentet, de néha előfordul. Nagyon ritkán az is előfordul, hogy ezekben a kommentekben ékezetek is vannak. Emiatt alapértelmezetten beteszem az elejére a kódolást, biztos ami biztos. Ékezetes fájlneveket még sosem használtam, elvi szinten ezeknek a fájloknak a helyes kezelésére is hasznos lehet az Utf-8-as kódolás megadása.

@charset "UTF-8";

MySql

Ma már a legtöbb MySql adatbázis szerveren az Utf-8 az alapértelmezett kódolás, ám ennek ellenére minden kapcsolódáskor érdemes megadni, hogy mi legyen az alapértelmezett kliens karakterkészlet.

Talán azért is fontos ez, mert idővel lehet, hogy az adatbázismotor feljebb lép, valamely nagyobb karakterkészletet fog alapértelmezettként használni. Jövőbeli problémák elkerülése miatt érdemes minden kapcsolódáskor megadni, hogy miként kapcsolódjunk!

$connect = mysqli_connect(...);
mysqli_set_charset($connect, 'utf8mb4');

phpMyAdmin

Amennyiben valamiért a phpMyAdmin nem UTF-8-at használna, akkor a konfigurációs fájlba az alábbiak megadásával javíthatjuk ezt.

$cfg['DefaultCharset'] = 'utf8mb4';
$cfg['DefaultConnectionCollation'] = 'utf8mb4_general_ci';

XML

Magam részéről sokkal jobban szeretek adatokat JSON alakban továbbítani, mint XML-ben. Ennek ellenére ebből a leírásból nem hiányozhat az XML, és benne az Utf-8-at tartalmazó deklaráció.

<?xml version="1.0" encoding="UTF-8"?>

shell_exec

Talán a legkevésbé ezzel találkozzunk, mivel a cikk célja az, hogy összeszedje az összes előfordulást, íme:

putenv('LC_ALL=hu_HU.UTF-8');
echo shell_exec('locale charmap');

UTF-8 BOM

A cikk elején leírtam, hogy kerüljük az Utf-8 BOM-ot, ám mégis előfordulhat, ahol szükségünk lesz rá. Például, amikor PHP-ből CSV fájlt generálok, akkor a generált tartalom elejére beteszem a szükséges bájtokat, hogy az Excel is tudja, hogy most egy Utf-8 fájlról van szó.

echo pack('CCC', 0xef, 0xbb, 0xbf);

Dupla átalakítás

Talán érdemes kiemelni egy típushibát, amely a szakmai fórumokban sajnos rendszeresen előkerül. Valami történt, és az eddigi helyes karakterkódolás elromlott, az á karakter helyet ĂĄ karakterek jelennek meg, miért?

Ha ezt a karaktert látod, akkor gyanakodhatsz arra, hogy kétszer lett a latin2-ről való utf8-ra átalakítás meghívva.

var_dump(iconv('ISO-8859-2', 'UTF-8', 'á')); // ĂĄ
var_dump(iconv('UTF-8', 'ISO-8859-2', 'ĂĄ')); // á

Zárszó

Végül csak annyi a végére, hogy ha mindenhol egységesen ugyanazt a karakterkódolást adjuk meg, akkor túl nagy gondunk nem lesz a hibás karakterekkel. Használjunk mindenhol Utf-8-at!