Umlaute in Formularen mit ISO-8859-1 und Ajax mit UTF-8

Eben wurde ein kleines Projekt von ISO-8859-1 nach UTF-8 umgestellt. Nötig war dies, da Eingaben mit Umlauten aus einem Formular durch Ajax zur Weiterverarbeitung an den Server geschickt werden sollten. Nun gibt es zwar eine Vielzahl von Tipps und Tricks, wie man Ajax beibringt mit ISO-8859-1 fehlerfrei zu kommunizieren. Eine zuverlässige Lösung scheint aber nicht in Sicht. Daher war die Entscheidung zur kompletten Umstellung auf UTF-8 schnell getroffen und alles works fine.

Bei der Umstellung von ISO-8859-1 nach UTF-8 sollte allerdings einiges beachtet werden. Hoffe die folgenden Infos sind für den ein oder anderen nützlich.

1. Dem Browser in jedem html-Dokument die verwendete Sprache mitteilen:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de" dir="ltr">

2. Zeichensatz in den Header für alle Dokumente (html, php, css)

Für Html:

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

Für XHTML:

<meta http-equiv="content-type" content="application/xhtml+xml;charset=utf-8">

3. Mit PHP einen HTTP-Header an den Browser schicken

Damit wird dem Browser gesagt, dass die übermittelte Seite im Format UTF-8 vorliegt:

<?php
header('content-type: text/html; charset=utf-8');
?>

Alternativ kann dies auch in die .htaccess geschrieben werden:

AddCharset utf-8 .css .html .xhtml .php

Oder alternativ auch in die php.ini:

default_mimetype = "text/html"
default_charset = "utf-8"

4. Einer ISO-kodierte MySQL-Datenbank mitteilen, dass UTF-8 verwendet werden soll

UTF-8 muss in der MySQL-Datenbank nicht explizit eingerichtet werden. Damit eine ISO-kodierte MySQL-Datenbank und ein UTF-8-Client fehlerfrei miteinander komunizieren können, genügt ein SQL-Statement nach der Datenbankverbindung:

$link = mysql_connect('localhost', 'user', 'password');
mysql_set_charset('utf8',$link);

Nicht zu empfehlen ist:

mysql_query("SET NAMES 'utf8'", $sql_connection);

5. UTF-8 und Formulare

Zur Übernahme von Formulardaten empfiehlt es sich, dem Formular die Codierung mitzuteilen:

<form action="machdas.php" accept-charset="UTF-8" name="" method="POST">

Sicher sind je nach individueller Konfiguration nicht alle Schritte nötig. Schaden kann es aber auch nichts. Und bei neuen Projekten, insb. bei Einsatz von Javascript und Ajax wird die konsequente Nutzung von UTF-8 empfohlen.

Umlaute und Ajax bei ISO-8859-1
Umlaute werden durch Ajax bei ISO-8859-1 falsch übergeben
Umlaute und Ajax bei UTF-8
Umlaute werden durch Ajax bei UTF-8 richtig übergeben

3 Gedanken zu „Umlaute in Formularen mit ISO-8859-1 und Ajax mit UTF-8

  1. Melina

    Für Php-ANSI-Dokumente kann auch folgendes verwendet werden:

    1. Data in ajax request mit escape codieren:
    data: {var1: escape(formvar1), var2: escape(formvar2)}

    2. Data in php-script mit utf8_urldecode decodieren:
    if(is_array($_POST)){
    foreach($_POST as $key => $val)
    {
    $_POST[$key] = utf8_urldecode(strip_tags($val));
    }

  2. ITSD Autor des Beitrags

    Anmerkung zum Wechsel der Zeichencodierung von ANSI nach UTF8 ohne BOM:
    Nach der Umstellung von ANSI nach UTF8 ohne BOM werden Umlaute und Sonderzeichen i.d.R. kodiert, also nicht mehr richtig im Quelltext angezeigt. Abhilfe schafft hier die Neueingabe von Umlauten/Sonderzeichen nachdem auf UTF8 umgestellt wurde. Diese Anmerkung mag etwas trivial erscheinen, aber alles schon passiert 😉

  3. ITSD Autor des Beitrags

    Die Angabe der Zeichencodierung:
    <meta http-equiv=“Content-Type“ content=“text/html; charset=UTF-8″>
    kann in Html5 auch derart definiert werden:
    <meta charset=“UTF-8″>
    Erstere Variante wird aber auch weiterhin unterstützt.

Schreibe einen Kommentar