Um mein CMS auch in bulgarisch betreiben zu können, musste ich mich nun mit UTF-8 beschäftigen.
Die Erfahrungen will ich hier nun kundtun.
Es ist vielleicht noch keine perfekte Lösung, aber Sie tut erstmal Ihren Dienst.
Allgemeines
Zum ersten muss dem Browser gesagt werden, welches Charset verwendet werden soll, nämlich UTF-8.
Dies ist vor allem dann ein Problem wenn der Browser das selbst festlegt, kann man böse Überraschungen
erhalten.
CODE:
<meta http-equiv="content-type" content="application/xhtml+xml;charset=utf-8" />
Dies sollte überall eingebunden werden. Man kann auch in der Css festlegen, welche Zeichensatz
verwendet werden soll, dies habe ich bisher aber noch nicht benötigt
CODE:
@charset "utf-8";
Praktisch ist vor allem im Umgang mit PHP, die Anwendung von header()
CODE:
header('content-type: text/html; charset=utf-8');
Man kann dies auch in der php.ini spezifizieren, sofern man Zugriff darauf hat. (default_mimetype & default_charset)
Damit der Besucher der Website auch in allen Formularen UTF-8 eingeben kann sollte man
accept-charset in den FORM-Kopf mit aufnehmen.
CODE:
<form accept-charset="utf-8" method=…
Der Vollständigkeit halber auch noch die Einbindung in XML
CODE:
<?xml version="1.0" encoding="utf-8"?>
PHP
All diese Einstellungen machen es möglich, dass UTF eingegeben und ausgegeben werden kann.
Die meisten die das verwenden haben allerdings eine Datenbank im Hintergrund, und schon da kann
es komplizierter werden. Als erstes benötigen wir eine Funktion, die überprüft ob ein String bereits
UTF-8 ist:
CODE:
/**
* Checks if String is UTF-8 Encoded
* @param string $string string to check
* @return boolean
*/
function is_utf8($string)
{
return preg_match('%^(?:
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)*$%xs', $string);
}
Dies ist nach der Vorgabe von
W3.
Somit kann nun schoneinmal festgestellt werden ob der String utf8 ist.
Nun noch eine Funktion, die UTF8 encodiert. Achtung, die Funktion benötigt is_utf8()
CODE:
/**
* Encodes String to UTF8
* @param string $string
* @return string
*/
function cms_utf8_encode($string)
{
if(is_utf8($string))
{
return $string;
} else {
if(function_exists('mb_convert_encoding'))
{
return mb_convert_encoding($string,'utf-8');
} else {
return utf8_encode($string);
}
}
}
Hier wird der String encodiert, bevor er z.B. in die Datenbank geschrieben wird.
Datenbank
Ich habe mich auch mit dem Thema UTF-8 und Datenbank auseinandergesetzt. Dabei muss man folgendes Wissen:
UTF-8 kostet mehr als z.B. der latin1 Zeichensatz, da mehr Speicherplatz verwendet wird. Sogar 3x soviel

Daher habe ich mich dazu entschlossen, da in der regel die wenigsten Zeichen in meinem System in Unicode gespeichert werden sollen, den latin1 Zeichensatz zu lassen.
Ich encodiere nur UTF-8 und leg das eben dann so ab. Funktioniert wunderbar, und ich hoffe das gibt keine Probleme.
In dem zug auch eine sehr detaillierte Beschreibung zu dem Thema von
Kris Köhntopp.
Ergänzend zum dem Eintrag bezüglich UTF-8 in Webapplikationen hier noch eine kurze Info zum versenden von UTF8 Mails mit PHP. Man kann zum einen die Mails wieder in ISO konvertieren, allerdings möchte ich nur auf die Möglichkeit eingehen, Mails un
Tracked: Feb 17, 18:14
Nachdem ich in einem früheren Blog Eintrag empfohlen habe, alle Daten aus Speicherplatzgründen die im UTF-8 Format sind in z.b. dem latin1 charset abzulegen, muss ich dem nun komplett wiedersprechen. Bei einem durchschnittlichen Projekt lädt man sic
Tracked: Aug 16, 02:41