UTF-8 all the way through: Komplettguide für PHP-Entwickler

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Warum wird Ihr Kyrillisch zu "Привет" und wie Sie das ein für alle Mal beheben

\n\n

Haben Sie schon einmal Ihre PHP-Website geöffnet und statt des erwarteten "Hallo Welt!" etwas wie Привет, мир! gesehen? Wenn ja – herzlichen Glückwunsch, Sie sind auf das klassische Problem UTF-8 all the way through gestoßen. Es ist diese Situation, in der die Kodierung irgendwo auf dem Weg von der Datenbank zum Browser kaputtgeht, und alle sind schuld, aber niemand will die Verantwortung übernehmen.

\n\n

Auf Stack Overflow hat diese Frage tausende Aufrufe und hunderte Antworten gesammelt. Und das aus gutem Grund. Selbst erfahrene Entwickler verlieren manchmal den Überblick bei den Kodierungseinstellungen. In diesem Tutorial zeigen wir Ihnen ein Schritt-für-Schritt-Rezept, wie Sie PHP, MySQL und den Browser dazu bringen, dass UTF-8 überall und immer funktioniert. Keine Zauberei – nur die richtigen Einstellungen.

\n\n

Schritt 1. Die Datenbank: Das Fundament Ihrer Kodierung

\n\n

Alles beginnt mit der Datenbank. Wenn Ihre Daten in MySQL in latin1 oder cp1251 gespeichert sind und Sie versuchen, sie in UTF-8 auszugeben, erhalten Sie Zeichensalat. Aber selbst wenn die Datenbank UTF-8 verwendet, gibt es eine Besonderheit: Die alte Kodierung utf8 in MySQL unterstützt keine Emojis und einige seltene Schriftzeichen. Die Lösung ist utf8mb4.

\n\n

1.1. Tabellen mit der richtigen Kodierung erstellen

\n\n

Geben Sie beim Erstellen einer neuen Tabelle immer Folgendes an:

\n\n
CREATE TABLE articles (\n    id INT AUTO_INCREMENT PRIMARY KEY,\n    title VARCHAR(255) NOT NULL,\n    content TEXT NOT NULL\n) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
\n\n

Alternativ können Sie die Standardkodierung für die gesamte Datenbank festlegen:

\n\n
ALTER DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
\n\n

Wichtig: utf8mb4_unicode_ci ist eine Sortierung (Collation). Sie verarbeitet alle Unicode-Zeichen korrekt. Wenn Sie keine sprachspezifische Sortierung benötigen, reicht auch utf8mb4_general_ci.

\n\n

1.2. Konvertierung vorhandener Tabellen

\n\n

Wenn Sie bereits Daten in einer anderen Kodierung haben, konvertieren Sie diese zuerst:

\n\n
ALTER TABLE articles CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
\n\n

Seien Sie jedoch vorsichtig: Wenn die Tabelle bereits Daten in latin1 enthielt, können diese in eine doppelte Kodierung umgewandelt werden (z. B. Привет). In diesem Fall müssen Sie die Spalten zuerst in binary und dann in utf8mb4 umwandeln. Das ist eine eigene Geschichte, aber der Einfachheit halber gehen wir davon aus, dass Sie mit einer leeren Datenbank beginnen.

\n\n

Schritt 2. PHP-Verbindung zur Datenbank: PDO konfigurieren

\n\n

Im modernen PHP verwenden Sie PDO (oder mysqli). Und hier gibt es einen kritischen Punkt: Nach dem Verbindungsaufbau zur Datenbank müssen Sie explizit die Kodierung angeben. Andernfalls kommuniziert PHP mit MySQL in der Standardkodierung (oft latin1).

\n\n

2.1. Die richtige PDO-Verbindungszeichenfolge

\n\n
$host = 'localhost';\n$dbname = 'your_database';\n$username = 'root';\n$password = '';\n\n$dsn = "mysql:host=$host;dbname=$dbname;charset=utf8mb4";\n\n$options = [\n    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,\n    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,\n    PDO::ATTR_EMULATE_PREPARES => false,\n];\n\ntry {\n    $pdo = new PDO($dsn, $username, $password, $options);\n} catch (PDOException $e) {\n    echo "Verbindung fehlgeschlagen: " . $e->getMessage();\n}
\n\n

Beachten Sie das charset=utf8mb4 im DSN. Dies zwingt PHP und MySQL, sich auf Verbindungsebene auf die Kodierung zu einigen.

\n\n

2.2. Alternative Methode (falls DSN nicht funktioniert)

\n\n

Manchmal lesen ältere PHP-Versionen oder Server den charset aus dem DSN nicht aus. Fügen Sie dann nach dem Verbindungsaufbau Folgendes hinzu:

\n\n
$pdo->exec("SET NAMES 'utf8mb4'");
\n\n

Die erste Methode ist jedoch vorzuziehen – sie ist sauberer und moderner.

\n\n

Schritt 3. HTTP-Header und HTML: Dem Browser die Wahrheit sagen

\n\n

Selbst wenn Datenbank und PHP in UTF-8 arbeiten, könnte der Browser entscheiden, dass

Blogs

Buchempfehlungen