Seite 1 von 1

Problem mit deutschen Umlauten und Lösung

Verfasst: 23.02.2007 12:38
von Reisemobilist
Hallo Leute,
ich habe lange gesucht und bisher viele Problemschilderungen, aber keine Lösungen gefunden.
Ich bin mit meinem Board umgezogen bzw. die Grundlage wurde auf einen neuen Stand gebracht. mySQL-Version ist 5, PHP auch.
Vorher lief mein Board problemlos, nach der Umstellung wurden die deutschen Sonderzeichen (öäüß) verstümmelt ausgegeben bzw. ein Neu-Eintrag ab dem deutschen Sonderzeichen abgeschnitten.

Das Problem: mySQL und PHP "unterhalten" sich standardmäßig über UTF8. Die deutschen Daten liegen jedoch im latin1-Zeichensatz vor. Weder PHP noch mySQL wissen dieses und versuchen, die ankommenden oder ausgehenden Zeichen in die UTF8-Collation einzuordnen (über die Collation - Übersetzungstabelle). Dadurch werden die deutschen "Sonderzeichen" verstümmelt.

Mit meinem Provider habe ich folgende, eigentlich sehr einfache Lösung gefunden:
Wir können jedem Kontakt zwischen unserem PHP und der Datenbank eine "Sprach- bzw. Übersetzungsanweisung" mit auf den Weg geben. Die Anweisung gilt für jeden schreibenden und lesenden Vorgang auf die SQL-Datenbank.
Folgendermaßen:
mysql_query("SET NAMES 'latin1'");
mysql_query("SET CHARACTER SET 'latin1'");

Als Code/Snipset würde ich dieses Anbieten (für die mysql4.php im Verzeichnis db, für die anderen Dateien bitte ich die Admins um Lösungswege):

Code: Alles auswählen

öffne /db/mysql4.php

finde if( $database != "")

DAVOR Einfügen:
			// Set Charset for this Connection, 
			// Eingefügt für die UTF8-mySQL5-Datenbank zur korrekten Umsetzung der unterschiedlichen Zeichensätze PHP-MySQL.
			// Zur Kodierung der Zeichen zwischen MySQL und PHP wird als Standard UTF8 verwendet. 
			// Sind ihre Daten in  MySQL z.B. in latin1_german1_ci gespeichert werden diese vor der Auslieferung an
			// PHP in UTF8 konvertiert. Dadurch werden die Zeichen an PHP und somit an den Browser im falschen Format ausgeliefert. 
			// Der Browser bekommt duch phpBB im Header die Information "charset=iso-8859-1" übergeben und kann daher mit UTF8 nicht viel anfangen.
			// Das Ganze ist durch einen einfachen SQL Befehl einstellbar.
			// PHP "spricht" latin1 und MySQL5 UTF8, jeder Verbindungsaufbau muss daher von PHP für die richtige Sprache initiiert werden.
			// Dann kann mySQL die ankommenden Daten richtig umsetzen und PHP bekommt die Daten im richtigen Format ausgeliefert.
			// Die mysql_query ist sozusagen als Übersetzer zwischen mySQL und PHP eingesetzt.
			// Höhne / Networkaholics, Herr Theobald 2007-02-20
			mysql_query("SET NAMES 'latin1'");
			mysql_query("SET CHARACTER SET 'latin1'");
			// Ende Set Charset for this Connection, 			

Ihr könnt natürlich die gesammten Kommentare weglassen, ich habe sie für die spätere Dokumentation in meinen Dateien gedacht.

Die Lösung werde ich auch noch als Vorschlag an die Snipset-Abteilung senden.

p.s.: Eine Alternative, das Template von phpBB anzupassen, damit der Browser es als UTF8 auswertet (im Header der HTML Seite steht momentan "charset=iso-8859-1"), hat nicht viel Erfolg gebracht (in der Datei "language/lang_german/lang_main.php" das Encoding auf UTF-8 umstellen). Die Ergebnisse der Datenbank werden dann zwar angezeigt, jedoch müssten alle "lang_"-Pakete auch auf UTF8-umgestellt werden, da deren Inhalte jetzt mit Fragezeichen statt deutschem Umlaut angezeigt werden.. Außerdem hat dies keine Auswirkungen auf die an die Datenbank gesendeten Dateien, die weiterhin verstümmelt werden.


Viel Spass und ich hoffe, einigen Leuten damit zu helfen.

Verfasst: 23.02.2007 12:47
von tom971
Hy
danke eine viel einfache Methode ist BU mit mysqldumper erstellen und wieder mit mysqldumper BU einspielen.
Und die ARTIKEL
die ich gerne empfehle
Servus Tom

Verfasst: 23.02.2007 13:16
von Reisemobilist
Hallo Tom,
Super Artikel unter mysqldumper, jedoch löst das nicht die Probleme (mit neuen Datensätzen!). Das Übertragen eines Backups auf eine neue Datenbank mag funktionieren und das Auslesen der vorhandenen Daten auch.

Ich habe lange rumexperimentiert: Wenn ich jetzt einen Beitrag NEU im Forum schreibe und die PHP-Scripts liefern die Daten an die SQL-Datenbank, kommt dort wegen der Übersetzungsproblematik wieder nur Schrott an (wie bei mysqldumper beschrieben). Deshalb muss ich für den Verbindungsaufbau jedesmal die Codierung mitgeben.

Das Los aller, die nicht alleiniger Besitzer einer SQL-Datenbank sind... und deshalb nicht die Einstellungen an der Datenbank-Wurzel vorhnehmen können.

Verfasst: 23.02.2007 13:37
von Mahony
Hallo Reisemobilist
Du könntest, wie bei mysqldumper.de beschrieben, die backup.sql mit textpad öffnen und neu abspeichern. Danach dann das Backup einspielen.

Somit dürfte dann alles wieder korrekt funktionieren.




Grüße: Mahony

Verfasst: 23.02.2007 13:40
von tom971
Reisemobilist hat geschrieben:Hallo Tom,
Super Artikel unter mysqldumper, jedoch löst das nicht die Probleme (mit neuen Datensätzen!). Das Übertragen eines Backups auf eine neue Datenbank mag funktionieren und das Auslesen der vorhandenen Daten auch.

Ich habe lange rumexperimentiert: Wenn ich jetzt einen Beitrag NEU im Forum schreibe und die PHP-Scripts liefern die Daten an die SQL-Datenbank, kommt dort wegen der Übersetzungsproblematik wieder nur Schrott an (wie bei mysqldumper beschrieben). Deshalb muss ich für den Verbindungsaufbau jedesmal die Codierung mitgeben.

Das Los aller, die nicht alleiniger Besitzer einer SQL-Datenbank sind... und deshalb nicht die Einstellungen an der Datenbank-Wurzel vorhnehmen können.
Hy
Danke für die Erklärung
Frage: was passiert wenn in einem Forum zwei verschiedene Sprachen gleich vertretten sind. Bei mir Kroatisch latin2 und Deutsch latin1
Vielen dank in Voraus
Tom

Verfasst: 23.02.2007 15:05
von DSB
tom971 hat geschrieben:was passiert wenn in einem Forum zwei verschiedene Sprachen gleich vertretten sind. Bei mir Kroatisch latin2 und Deutsch latin1
Es ist Sache des Programms, sich darum zu kümmern.
Eigentlich muss für jede Sprache ein entsprechender Header an den Browser und vorher beim Auslesen oder Eintragen der Daten die Verbindung zur MySQL-DB entsprechend auf diese Sprache gestellt werden. Oder, wenn die Webseite als ISO 8859-x interpretiert wird, muss vor der Ausgabe jede Zeichenkette nach ISO konvertiert werden (was aber nicht ausreichend ist, da nicht jedes Zeichen einer anderen Sprache im ISO-Zeichen vorhanden ist).
Kommen auf einer einzigen Seite unterschiedliche Zeichensätze vor, so muss zwangsläufig vor der Ausgabe ein Zeichensatz in den anderen gewandelt werden. Ein Browser kann nicht 2 unterschiedliche Zeichensätze auf einer Seite darstellen.

Das ist natürlich viel zu umständlich und fehleranfällig und genau deshalb hat man ja unicode entwickelt. Am einfachsten ist es also wenn der Browser eine utf8-kodierte Webseite erhält und die Daten vorher bei der Datenbank auch als utf8 abgeholt werden. So bewegt man sich innerhalb des gleichen Zeichensatzes und es gibt keine Probleme.

Lange Rede - kurzer Sinn: letztlich muss sich die phpbb-Software um diesen Umstand kümmern.

Der Ansatz von Reisemobilist phpbb dahingehend anzupassen ist völlig richtig, kann aber nur bei deutschen Seiten und auch erst ab MySQL Version 4.1 aufwärts helfen.
Im Prinzip müsste ein Script zunächst die MySQL-Version ermitteln und dann entsprechend unterschiedlich handeln.

Ein Gesamtkonzept zur Anpassung wäre z.B.:

- Ausgabe der generierten Webseite erfolgt immer in utf8 mit entsprechend gesendetem Header
- Verbindung zur Datenbank erfolgt ab MySQL 4.1 per utf8-Verbindung, davor per latin1 und vor der Zuweisung an ein Template erfolgt eine Umwandlung in utf8 mittels utf8_encode()
- alle Templates müssen im utf8-Format vorliegen
- alle Sprachdateien müssen in utf8 gewandelt werden

Damit wäre schon einmal viel erschlagen, aber auch hier fehlt noch der Fall, wenn eine MySQL-Version vor 4.1 vorliegt und der Standardzeichensatz nicht latin1 ist. Hier gibt es das Problem, dass PHP keine Konvertierungsroutinen von einem beliebigen Zeichensatz nach utf8 bietet. Das gibt es lediglich für latin1.

Die ganze Geschichte ist also ganz schön komplex und verursacht eine Menge Arbeit. Mein Konzept wäre aber schon einmal eine zukunftssichere Lösung für alle Sprachen, die im Unicode enthalten sind (und das sidn eine ganze Menge). MySQL-Server vor Version 4.1 werden sicherlich bald auch bei keinem Hoster mehr zu finden sein, so dass man ältere Versionen fast schon vernachlässigen kann.

Verfasst: 27.02.2007 13:20
von hellcreature
Das Problem: mySQL und PHP "unterhalten" sich standardmäßig über UTF8. Die deutschen Daten liegen jedoch im latin1-Zeichensatz vor. Weder PHP noch mySQL wissen dieses und versuchen, die ankommenden oder ausgehenden Zeichen in die UTF8-Collation einzuordnen (über die Collation - Übersetzungstabelle). Dadurch werden die deutschen "Sonderzeichen" verstümmelt.
Sorry, wenn ich Begriffsstutzig erscheine *g*
Wenn mySQL und PHP sich standardmäßig über UTF8 "unterhalten"; muesste dann nicht jeder standardmaessig dieses Problem haben????
Bei mir ist dieses Problem noch nie aufgetaucht. Auch nach einem Serverumzug nicht und hatte dieses Problem bis vor einer Woche auch nirgends in phpBB-Foren bemerkt.
Tritt es bei mir dann auch auf, wenn ich mein phpBB-Forum update auf die neueste Version, was ich eigentlich demnächst vorhatte...?
Wenn ja, lass ich es lieber, weil mit der obigen Anleitung kann ich als PHP-Unwissender nix anfangen... :o(
Bei einem Bekannten ist genau dieses Problem, dass ab einem Sonderzeichen im Text der Beitrag abgeschnitten wird.
In Überschriften taucht der Beitrag dann garnicht auf etc...

Verfasst: 27.02.2007 13:57
von DSB
hellcreature hat geschrieben:Wenn mySQL und PHP sich standardmäßig über UTF8 "unterhalten"; muesste dann nicht jeder standardmaessig dieses Problem haben????
Ob das so ist und ob sie das überhaupt können hängt von der MySQL-Server-Version und den entsprechenden Parametern ab.
Lies Dir den oben verlinkten Artikel durch. Da ist das genaustens erkärt wann mit welcher Version welcher Effekt auftritt und wie man prüfen kann, was die Standardverbindungskennung des MySQL-Servers ist.