Warum wird Ihr Kyrillisch zu "Привет" und wie Sie das ein für alle Mal beheben
\n\nHaben 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.
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\nSchritt 1. Die Datenbank: Das Fundament Ihrer Kodierung
\n\nAlles 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.
1.1. Tabellen mit der richtigen Kodierung erstellen
\n\nGeben Sie beim Erstellen einer neuen Tabelle immer Folgendes an:
\n\nCREATE 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\nAlternativ können Sie die Standardkodierung für die gesamte Datenbank festlegen:
\n\nALTER DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n\nWichtig: 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.
1.2. Konvertierung vorhandener Tabellen
\n\nWenn Sie bereits Daten in einer anderen Kodierung haben, konvertieren Sie diese zuerst:
\n\nALTER TABLE articles CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n\nSeien 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.
Schritt 2. PHP-Verbindung zur Datenbank: PDO konfigurieren
\n\nIm 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\n2.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\nBeachten Sie das charset=utf8mb4 im DSN. Dies zwingt PHP und MySQL, sich auf Verbindungsebene auf die Kodierung zu einigen.
2.2. Alternative Methode (falls DSN nicht funktioniert)
\n\nManchmal 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\nDie erste Methode ist jedoch vorzuziehen – sie ist sauberer und moderner.
\n\nSchritt 3. HTTP-Header und HTML: Dem Browser die Wahrheit sagen
\n\nSelbst wenn Datenbank und PHP in UTF-8 arbeiten, könnte der Browser entscheiden, dass