Speichern von Umlauten
klaus
- php
Hallo,
bisher hatte ich nie Schwierigkeiten, Texte mit deutschen Umlauten, die über ein Textarea eingegeben wurden, in der Tabelle zu speichern.
Merkwürdigerweise werden nun die deutschen Umlaute ö ä ü in der Tabelle als ö ä ü gespeichert.
Wieso wird der Text nicht Eins-zu-Eins gespeichert und wie kann ich das wieder geradebiegen?
Euer Klaus
Hallo
bisher hatte ich nie Schwierigkeiten, Texte mit deutschen Umlauten, die über ein Textarea eingegeben wurden, in der Tabelle zu speichern.
Merkwürdigerweise werden nun die deutschen Umlaute ö ä ü in der Tabelle als ö ä ü gespeichert.
Wieso wird der Text nicht Eins-zu-Eins gespeichert und wie kann ich das wieder geradebiegen?
Offensichtlich benutzt eine der Übertragungsstationen einen falschen Charset.
Sowohl das HTML-Dokument mit dem Formular, die Datenbank selbst und auch die von PHP etablierte Verbindung mit dem DB-Server sollten die gleiche Zeichenkodierung benutzen. Kontrolliere das mal bitte.
Tschö, Auge
Hi,
ergänzend:
Sowohl das HTML-Dokument mit dem Formular, die Datenbank selbst und auch die von PHP etablierte Verbindung mit dem DB-Server sollten die gleiche Zeichenkodierung benutzen. Kontrolliere das mal bitte.
Und im Idealfall heißt die Kodierung UTF.
Cheatah
Hi!
Und im Idealfall heißt die Kodierung UTF.
Ach!
+t
Also insgesamt: UTF-8.
Und das was da im OP zu lesen war (ö ä ü) sind UTF-8-kodierte Umlaute, die aber als ISO-8859-1 gelesen wurden und nicht als UTF-8.
Lo!
Hi,
Und im Idealfall heißt die Kodierung UTF.
Also insgesamt: UTF-8.
meistens. Wenn mal UTF-16 draus wird, weil einfach der überwiegende Teil der Zeichen außerhalb von ASCII liegt, ist das aber auch nicht schlimm :-)
Cheatah
Offensichtlich benutzt eine der Übertragungsstationen einen falschen Charset.
Sowohl das HTML-Dokument mit dem Formular, die Datenbank selbst und auch die von PHP etablierte Verbindung mit dem DB-Server sollten die gleiche Zeichenkodierung benutzen. Kontrolliere das mal bitte.
Da ich den PHP-Teil immer als eine Art Puzzle einbinde, haben alle Seiten immer den gleichen Header etc. Daher sollte sich doch eigentlich das Charset eigentlich nicht ändern können. Ebenso bei der Tabelle. Das Charset der Tabelle entspricht auch dem Charset aller anderen knapp Tabellen.
Der einzige Unterschied besteht darin, dass ich das Formular wiederum über Ajax anzeigen lasse. In diesem Script werden keine Angaben bezüglich irgendwas gemacht, da ja Styles, Charset und Datenbank-Verbindungen ja eigentlich schon festgelegt sind.
Kann nicht nicht die "falschen" Umlaute wieder korrigieren und dann wegspeichern? Ist vielleicht nur ein Workaround, würde mir aber schon reichen.
Klaus
Hi,
Da ich den PHP-Teil immer als eine Art Puzzle einbinde, haben alle Seiten immer den gleichen Header etc. Daher sollte sich doch eigentlich das Charset eigentlich nicht ändern können.
der Header ist irrelevant, wenn die Datei von Deinem Editor in einem anderen Encoding abgespeichert wurde.
Kann nicht nicht die "falschen" Umlaute wieder korrigieren und dann wegspeichern?
Wie soll denn bitte "falsch" erkannt werden? Die Zeichen sind doch da, es ist alles korrekt. Dass es nicht diejenigen Zeichen sind, die Du gerne hättest, kann kein Programm riechen. Aber wenn Du magst, kannst Du in der Datenbank ja per UPDATE-Statement Ersetzungen vornehmen - nur nützt Dir das exakt gar nichts, wenn Du nicht das eigentliche Problem löst, denn dann wird bei nächster Gelegenheit wieder Schwachsinn in die DB geschrieben.
Cheatah
Hallo
Offensichtlich benutzt eine der Übertragungsstationen einen falschen Charset.
Sowohl das HTML-Dokument mit dem Formular, die Datenbank selbst und auch die von PHP etablierte Verbindung mit dem DB-Server sollten die gleiche Zeichenkodierung benutzen. Kontrolliere das mal bitte.
Da ich den PHP-Teil immer als eine Art Puzzle einbinde, haben alle Seiten immer den gleichen Header etc. Daher sollte sich doch eigentlich das Charset eigentlich nicht ändern können.
Ich meine nicht die meta-Angabe im Dokument! prüfe in deinem Editor, mit welchem Charset die HTML-Vorlagen und die Skripte gespeichert werden. Idealerweise -- wenn auch nicht zwingend -- ist das UTF-8. Der Webserver deines Hosters muss das natürlich auch so ausliefern können.
Ebenso bei der Tabelle. Das Charset der Tabelle entspricht auch dem Charset aller anderen knapp Tabellen.
Wenn wir davon ausgehen, dass UTF-8 für die Skripte und HTML-Quelltexte verwendet wird (das gilt analog auch für einen anderen Charset), sollten Tabellen und Felder, die Text aufnehmen, ebenfalls die UTF-8-Codierung verwenden. Zusätzlich gibst du bei der Verbindungsaufnahme mit dem DB-Server UTF-8 als zu verwendendem Charset vor. Ich mache das immer (innerhalb einer Funktion) mit einem allerersten Query, den ich direkt nach erfolgter Verbindungsaufnahme absetze.
function auge_connect_dbserver($db) {
$s = mysql_connect($db["host"],$db["user"],$db["pass"]);
$t = mysql_select_db($db["dbase"],$s);
if ($s===false or $t===false) {
return false;
} else {
# UTF-8 erzwingen
$q = "SET NAMES utf8";
$a = mysql_query($q,$s);
if ($a===false) {
return false;
} else {
return $s;
}
}
} # Ende: auge_connect_dbserver
Die Verbindung wird aufgebaut und mit SET NAMES utf8
wird als erstes der Charset der verbindung erzwungen. Klappt irgendwas nicht, dann gibt die Funktion false
zurück, ansonsten die Kennung der Verbindung.
"Draußen" im Skript rufe ich diese Funktion auf, prüfe dann den Rückgabewert und lasse danach das Skript ablaufen oder eine Fehlermeldung ausgeben.
<?php
// irgendwelche includes
$sql = auge_connect_dbserver($db);
if ($sql===false) {
// Fehlermeldung generieren
} else {
// Datenbankabfragen, Verarbeitung, Generierung der Ausgabe der Daten
}
// Ausgabe der generierten Daten bzw. der Fehlermeldung innerhalb eines HTML-Gerüsts
?>
Der einzige Unterschied besteht darin, dass ich das Formular wiederum über Ajax anzeigen lasse. In diesem Script werden keine Angaben bezüglich irgendwas gemacht, da ja Styles, Charset und Datenbank-Verbindungen ja eigentlich schon festgelegt sind.
Auch und besonders(!) deine JavaScript-Skripte sollten UTF-8 als Charset verwenden, da bei Ajax, so es keine expliziten anderen Vorgaben gibt, automatisch von UTF-8 als Codierung ausgegangen wird.
Tschö, Auge
Hi!
Offensichtlich benutzt eine der Übertragungsstationen einen falschen Charset.
Sagen wir mal "anderen" und dann besser Kodierung, auch wenn das oft als "charset" angegeben werden muss.
Da ich den PHP-Teil immer als eine Art Puzzle einbinde, haben alle Seiten immer den gleichen Header etc. Daher sollte sich doch eigentlich das Charset eigentlich nicht ändern können.
Gibst du auch bei den AJAX-Responses einen Content-Tape-Header mit charset an?
Und schau bitte genauer hin, an welcher Stelle welche Kodierung vorliegt. Meine Glaskugel sagt mir, dass die per AJAX an PHP gesendeten Daten UTF-8-kodiert sind, du aber ISO-8859-1 annimmst. AJAX das UTF-8 abzugewöhnen, bekommt man zwar hin, wenn man die Daten vor dem Versenden mit escape() behandelt. Besser ist es, modern zu werden, das Problem gleich richtig anzupacken und generell UTF-8 zu verwenden. Allerdings ist das, wenn man solch eine Umstellung das erste Mal macht, mitunter frustrierend, weil man Stellen übersieht, an denen eine Kodierung ausgehandelt oder angegeben werden muss.
Lo!
Hallo,
Content-Tape-Header
das ist die Grifflasche am Ende des Bandes, das aus der Cassette herausragt?
*scnr*
Martin
Hallo
Offensichtlich benutzt eine der Übertragungsstationen einen falschen Charset.
Sagen wir mal "anderen" und dann besser Kodierung, auch wenn das oft als "charset" angegeben werden muss.
Öhhm, ja. Hach, immer diese Unganauigkeiten.
Da ich den PHP-Teil immer als eine Art Puzzle einbinde, haben alle Seiten immer den gleichen Header etc. Daher sollte sich doch eigentlich das Charset eigentlich nicht ändern können.
Gibst du auch bei den AJAX-Responses einen Content-Tape-Header mit charset an?
Und schau bitte genauer hin, an welcher Stelle welche Kodierung vorliegt. Meine Glaskugel sagt mir, dass die per AJAX an PHP gesendeten Daten UTF-8-kodiert sind, du aber ISO-8859-1 annimmst.
Als Tip für klaus:
Benutze zur diesbezüglichen Prüfung den FF mit der Erweiterung Live HTTP Headers. Bei jedem Request an einen Webserver liefert die Erweiterung sämtliche hin-und-her-geschickten HTTP-Header betreffen. Somit kannst du alles, was den Weg zwischen Webserver und dir/deinem Browser betrifft, überwachen.
Tschö, Auge