Zeichencodierung bei mehrsprachigen Formularen

Intended audience: XHTML/HTML-Autoren (die Web-Editoren/Texteditoren oder Scripte benutzen), Script-Entwickler (PHP, JSP u.a.), Webprojekt-Manager und alle, die Informationen suchen, wie man mit Zeichencodierungen bei mehrsprachigen Formularen umgeht

Question

Wie bewältigt man am besten Probleme mit der Zeichencodierung bei Formularen, in denen verschiedene Sprachen und Schriften verwendet werden können?

Answer

Am besten bewältigt man Probleme mit der Zeichencodierung bei (X)HTML-Formularen, indem man alle seine Seiten in UTF-8 ausliefert. UTF-8 kann die Zeichen der allermeisten Sprachen abbilden. Browser schicken Formulardaten in derselben Zeichencodierung zurück, in der auch die Webseite codiert ist, die das Formular enthält. Dann können Nutzer Daten in der Sprache und Schrift eingeben, die sie benötigen.

Damit dies funktioniert, müssen einige Dinge beachtet werden. Zum einen ist es wichtig, dem Browser anzugeben, dass die Formularseite in UTF-8 codiert ist. Es gibt mehrere Arten, dem Browser die Zeichencodierung einer Seite mitzuteilen. Das ist immer wichtig, besonders aber, wenn auf der Seite selbst keine Zeichen außer ASCII-Zeichen vorkommen, die Nutzer aber auch andere Zeichen eingeben könnten.

Zum anderen ist es angebracht, dass das Script, welches die Formulardaten verarbeitet, prüft, ob die empfangenen Daten wirklich UTF-8-codiert sind (falls etwas schiefging, z.B. wenn der Nutzer die Zeichencodierung umgestellt hat). Die Prüfung ist möglich, weil UTF-8 ein spezifisches Bytemuster aufweist, das in keiner anderen Codierung auftritt. Wenn die Daten nicht in UTF-8 ankommen, sollte eine Fehlermeldung zurückgesendet werden.

In Perl würde ein regulärer Ausdruck, der auf UTF-8 prüft, beispielsweise so aussehen:

$field =~
  m/\A(
     [\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
  )*\z/x;

Der Ausdruck kann an andere Programmiersprachen angepasst werden. Er beachtet verschiedene Probleme wie unerlaubte Bytesequenzen und missbräuchlich verwendete Surrogate (Ersatzzeichen). Er gibt true zurück, wenn $field UTF-8 ist, ansonsten false.