Du bist nicht angemeldet (anmelden)
Seite 1
Erledigt: Problem mit Codierung und Umlauten
Hi Leute,
folgendes Problem.
Ich speichere Formulardaten in eine Datenbank. Die Tables sind utf-8 codiert.
Vor dem Speichern lasse ich eine Funktion über die Eingaben laufen, welche mit str_replace nach Umlauten und so ein Zeugs sucht und dieses dann durch HTML-Code ersetzt.
Komischerweise klappt dies auf einem Server wunderbar und auf einem anderen Server werden zum Beispiel Umlaute nicht erkannt und somit auch nicht ersetzt.
Jemand ne Idee?
ToM
folgendes Problem.
Ich speichere Formulardaten in eine Datenbank. Die Tables sind utf-8 codiert.
Vor dem Speichern lasse ich eine Funktion über die Eingaben laufen, welche mit str_replace nach Umlauten und so ein Zeugs sucht und dieses dann durch HTML-Code ersetzt.
Komischerweise klappt dies auf einem Server wunderbar und auf einem anderen Server werden zum Beispiel Umlaute nicht erkannt und somit auch nicht ersetzt.
Jemand ne Idee?
ToM
Normalerweise wandelt man Umlaute bei der Ausgabe um, nicht andersrum.
Vermutlich wird auf dem anderen Server ein falsche Header gesendet, der den Charset zerhaut
Du kannst ja mal sicherheitshalber ganz oben
einsetzen und testen ob es dann geht.
Hier noch ein paar Infos: http://blog.antikoerperchen.de/beitrag/4...ntity.html
Vermutlich wird auf dem anderen Server ein falsche Header gesendet, der den Charset zerhaut
Du kannst ja mal sicherheitshalber ganz oben
header('content-type: text/html; charset=utf-8');
einsetzen und testen ob es dann geht.
Hier noch ein paar Infos: http://blog.antikoerperchen.de/beitrag/4...ntity.html
das hängt zum teil von der php und mysql installation ab. mit einer latin-kollation könntest du dir arbeit ersparen.
kero schrieb am 06.02.08, 12:21 Uhr:
das hängt zum teil von der php und mysql installation ab. mit einer latin-kollation könntest du dir arbeit ersparen.
Danke ich möchte utf-8 verwenden.
Welche Arbeit kann ich mir ersparen?
ToM
phloo schrieb am 06.02.08, 12:27 Uhr:
v.a. wieso wandelst du das mit str_replace um und nicht mit htmlspecialchars/htmlentities?
weil die kein utf-8 unterstützen.
ToM
kero schrieb am 06.02.08, 12:36 Uhr:
doch.
oder welche mysql und php versionen hast du?
php version 5.
laut http://at.php.net/manual/de/function.htm...tities.php wird utf-8 nicht unterstützt.
habs jetzt auch mit htmlentities probiert, aber es passt trotzdem nicht. seh ich es richtig, dass htmlentities aus ä ein
ä
ToM
kero schrieb am 06.02.08, 12:55 Uhr:
hast du im formular accept-charset=...?
hatte ich nicht, ändert aber auch nix.
mit str_replace wird nix geändert
mit htmlentities wird
ü
ToM
Das Problem kann auch verschiedenen Ebenen liegen, darum hier ein paar nützliche links.
php string functions & unicode
unicode & webapplikationen mit utfde und encode –> falls Datebank utf –> de-/encode kann weggelassen werden
php & unicode mit mbstring extension
krude faq zu apache/php/mysql & unicode ohne utfde/encode
php string functions & unicode
unicode & webapplikationen mit utfde und encode –> falls Datebank utf –> de-/encode kann weggelassen werden
php & unicode mit mbstring extension
krude faq zu apache/php/mysql & unicode ohne utfde/encode
function noUmlaute($txt){$txt = str_replace("&","&",$txt);$txt = str_replace("ä","ä",$txt);$txt = str_replace("Ä","Ä",$txt);$txt = str_replace("ü","ü",$txt);$txt = str_replace("Ü","Ü",$txt);$txt = str_replace("ö","ö",$txt);$txt = str_replace("Ö","Ö",$txt);$txt = str_replace("ß","ß",$txt);$txt = str_replace("<","<",$txt);$txt = str_replace(">",">",$txt);$txt = str_replace('"',""",$txt);$txt = str_replace("'","‘",$txt);$txt = str_replace("–","–",$txt);$txt = str_replace("£","£",$txt);$txt = str_replace('€',"€",$txt);$txt = str_replace("§","§",$txt);$txt = str_replace("'","′",$txt);return $txt;}
function renameFile($data) //Datei umbenennen{global $tpl;$dateititel = $data["dateititel"];$dateititel = $this->noUmlaute($dateititel);$dateititel2 = htmlentities($dateititel);//TESTING///////////////////////////////////////echo $dateititel;echo "".$dateititel2;///////////////////////////////////////////////$sql = "UPDATE files SET cTitel='".$dateititel."' WHERE nFileID = ".$data["myFileID"];$rs = mysql_query($sql) or die ("Fehler beim Umbennen des Files!");$this->writeHistory($sql,$_SESSION["myUserID"]);$tpl->parse("TPL_ONLOAD_WHAT","load_error_overlay");$tpl->parse("TPL_ONLOAD", "onload");//$tpl->assign("TPL_ERROR_LIST", $errorList);$tpl->assign("TPL_ERROR", "Datei wurde erfolgreich umbenannt!");//Weiterleitung um wieder saubere URL zu haben$host = $_SERVER['HTTP_HOST'];$uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');$extra = "filemanager.php?uploadID=".$data["myUploadID"]."&openerFieldname=".$data["myOpenerFieldname"];$header = "http://".$host."".$uri."/".$extra;//header("Location: ".$header);//header("Location: filemanager.php?uploadID=".$data["myUploadID"]."&openerFieldname=".$data["myOpenerFieldname"]);}
wenn ich die daten ohne umwandlung übernehme bleibt in einer utf-8 codierten datenbank auch ein ü.
soweit so gut.
wenn ich jetzt beim ausgeben der inhalte mit str_replace nach dem ü suche, findet er nix. im quellcode steht aber ein ü?????
ToM
soweit so gut.
wenn ich jetzt beim ausgeben der inhalte mit str_replace nach dem ü suche, findet er nix. im quellcode steht aber ein ü?????
ToM
direkt nach der mysql verbindung diesen Befehl ausführen:
ggf mit utf8_decode arbeiten, aber das sollte nicht nötig sein und natürlich mit htmlentities.
@mysql_query("SET NAMES utf8");
ggf mit utf8_decode arbeiten, aber das sollte nicht nötig sein und natürlich mit htmlentities.
In einer per utf8_general_ci kodierten Tabelle in der Datenbank sollte kein ü stehen, sondern ein ü. Deswegen ist es ja UTF-8 und kein ISO. Warum du vor dem Einfügen eines Datensatzes in die Datenbank die Umlaute in HTML-Codes umwandeln willst, ist mir ein Rätsel. Sowas sollte man bei der Ausgabe machen – mit htmlspecialchars($str, ENT_QUOTES, 'UTF-8') zum Beispiel.
Vielleicht solltest du auch utf8_encode() und utf8_decode() ausprobieren.
Vielleicht solltest du auch utf8_encode() und utf8_decode() ausprobieren.
Matze schrieb am 06.02.08, 13:59 Uhr:
In einer per utf8_general_ci kodierten Tabelle in der Datenbank sollte kein ü stehen, sondern ein ü. Deswegen ist es ja UTF-8 und kein ISO. Warum du vor dem Einfügen eines Datensatzes in die Datenbank die Umlaute in HTML-Codes umwandeln willst, ist mir ein Rätsel. Sowas sollte man bei der Ausgabe machen – mit htmlspecialchars($str, ENT_QUOTES, 'UTF-8') zum Beispiel.
Vielleicht solltest du auch utf8_encode() und utf8_decode() ausprobieren.
wie zuvor schon geschrieben:
ich ändere die Umlaute vor dem Speichern nicht mehr.
Wenn kein ü in der db stehen soll, wie kann es dann sein, wenn ich im phpmyadmin den datensatz ändere trotzdem ein ü erhalten bleibt?
ToM
Soweit ich weiß, werden bei einer nachträglichen Änderung des Charset in der Datenbank die Inhalte nicht neu konvertiert. Das geschieht wohl erst bei neuen Datensätzen.
Matze schrieb am 06.02.08, 13:59 Uhr:
In einer per utf8_general_ci kodierten Tabelle in der Datenbank sollte kein ü stehen, sondern ein ü. Deswegen ist es ja UTF-8 und kein ISO. Warum du vor dem Einfügen eines Datensatzes in die Datenbank die Umlaute in HTML-Codes umwandeln willst, ist mir ein Rätsel. Sowas sollte man bei der Ausgabe machen – mit htmlspecialchars($str, ENT_QUOTES, 'UTF-8') zum Beispiel.
Vielleicht solltest du auch utf8_encode() und utf8_decode() ausprobieren.
mag mich ja täuschen, aber der sinn, eine table auf utf8_general_ci zu stellen ist unter anderem, dass in der datenbank umlaute richtig angezeigt werden. fülle ich also die datenbank beispielsweise von php-seiten aus, die utf8 kodiert sind, sollten die umlaute auf jeden fall erhalten beleiben und nicht in irgendeiner form kodiert werden. ist ja nebenbei nicht nur mit deutschen umlauten so, sondern auch mit arabischen zeichen, chinesischen, etc.
korrigiert mich bitte, wenn ich falsch liege.
huschai schrieb am 06.02.08, 16:59 Uhr:
mag mich ja täuschen, aber der sinn, eine table auf utf8_general_ci zu stellen ist unter anderem, dass in der datenbank umlaute richtig angezeigt werden. fülle ich also die datenbank beispielsweise von php-seiten aus, die utf8 kodiert sind, sollten die umlaute auf jeden fall erhalten beleiben und nicht in irgendeiner form kodiert werden. ist ja nebenbei nicht nur mit deutschen umlauten so, sondern auch mit arabischen zeichen, chinesischen, etc.
korrigiert mich bitte, wenn ich falsch liege.
also nach meinen tests heute hast du recht.
ich speichere jetzt den inhalt in die db ohne umwandlung in html-zeichen. somit wird auch ein umlaut als umlaut in der db gespeichert.
beim auslesen hab ich nun ein utf8_encode gemacht um anschließend die umlaute und sonderzeichen in html-code umwandeln zu können.
Funkt jetzt auf beiden Testservern.
ToM
