Peter Rehm's Blog

apple,development,life & more

UTF-8 in Webapplikationen

Mit 3 Kommentaren

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.

Geschrieben von Peter Rehm

18.11.2006 um 14:05:13

Tags für diesen Artikel: , , , ,

Stress Tests für Webentwickler

Mit 1 Kommentar

Immer wieder macht sich ein Webentwickler gedanken, wie seine Webanwendung sich wohl unter Last verhält. Dies kann man nachstellen:

Im folgenden möchte ich kurz die Tools auflisten die man dazu verwenden kann:



Vielleicht kann ich demnächst Erfahrungsberichte dazu abgeben wenn ich die Zeit gefunden habe die Tools mal zu testen.

Geschrieben von Peter Rehm

19.09.2006 um 21:02:48

Abgelegt in Verschiedenes

Tags für diesen Artikel: , ,