Erledigt: Problem mit Codierung und Umlauten

 


ToM04
Gast

06.02.08
12:08 Uhr
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
Link zu diesem Beitrag in die Zwischenablage kopieren
phloo
Veteran

06.02.08
12:15 Uhr
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
  1. header('content-type: text/html; charset=utf-8');
Quelltext in Zwischenablage kopieren
einsetzen und testen ob es dann geht.

Hier noch ein paar Infos: http://blog.antikoerperchen.de/beitrag/4...ntity.html
Link zu diesem Beitrag in die Zwischenablage kopieren
ToM04
Gast

06.02.08
12:19 Uhr
Sorry, aber auch den Content-Type zu ändern bringt nix.

Noch ne Idee.

ToM
Link zu diesem Beitrag in die Zwischenablage kopieren
kero
Gast

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.
Link zu diesem Beitrag in die Zwischenablage kopieren
ToM04
Gast

06.02.08
12:23 Uhr
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
Link zu diesem Beitrag in die Zwischenablage kopieren
kero
Gast

06.02.08
12:24 Uhr
ich muss keine umlaute umwandeln.
Link zu diesem Beitrag in die Zwischenablage kopieren
phloo
Veteran

06.02.08
12:27 Uhr
v.a. wieso wandelst du das mit str_replace um und nicht mit htmlspecialchars/htmlentities?
Link zu diesem Beitrag in die Zwischenablage kopieren
ToM04
Gast

06.02.08
12:34 Uhr
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
Link zu diesem Beitrag in die Zwischenablage kopieren
kero
Gast

06.02.08
12:36 Uhr
doch. ouw

oder welche mysql und php versionen hast du?
Link zu diesem Beitrag in die Zwischenablage kopieren
ToM04
Gast

06.02.08
12:47 Uhr
kero schrieb am 06.02.08, 12:36 Uhr:

doch. ouw

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
  1. ä
Quelltext in Zwischenablage kopieren macht?

ToM
Link zu diesem Beitrag in die Zwischenablage kopieren
kero
Gast

06.02.08
12:55 Uhr
hast du im formular accept-charset=...?

Link zu diesem Beitrag in die Zwischenablage kopieren
ToM04
Gast

06.02.08
13:04 Uhr
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
  1. ü
Quelltext in Zwischenablage kopieren daraus, weil ü das aus einem Umlaut u erstellt wird!


ToM
Link zu diesem Beitrag in die Zwischenablage kopieren
phloo
Veteran

06.02.08
13:12 Uhr
Poste doch mal deinen Quellcode.
Inklusive Header.
Link zu diesem Beitrag in die Zwischenablage kopieren
lukas
Gast

06.02.08
13:19 Uhr
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
Link zu diesem Beitrag in die Zwischenablage kopieren
ToM04
Gast

06.02.08
13:21 Uhr
  1. function noUmlaute($txt)
  2. {
  3. $txt = str_replace("&","&",$txt);
  4.  
  5. $txt = str_replace("ä","ä",$txt);
  6. $txt = str_replace("Ä","Ä",$txt);
  7. $txt = str_replace("ü","ü",$txt);
  8. $txt = str_replace("Ü","Ü",$txt);
  9. $txt = str_replace("ö","ö",$txt);
  10. $txt = str_replace("Ö","Ö",$txt);
  11. $txt = str_replace("ß","ß",$txt);
  12. $txt = str_replace("<","&lt;",$txt);
  13. $txt = str_replace(">","&gt;",$txt);
  14. $txt = str_replace('"',"&quot;",$txt);
  15. $txt = str_replace("'","&lsquo;",$txt);
  16. $txt = str_replace("–","&ndash;",$txt);
  17. $txt = str_replace("£","&pound;",$txt);
  18. $txt = str_replace('€',"&euro;",$txt);
  19. $txt = str_replace("§","&sect;",$txt);
  20. $txt = str_replace("'","&prime;",$txt);
  21.  
  22. return $txt;
  23. }
Quelltext in Zwischenablage kopieren

  1. function renameFile($data) //Datei umbenennen
  2. {
  3. global $tpl;
  4.  
  5. $dateititel = $data["dateititel"];
  6. $dateititel = $this->noUmlaute($dateititel);
  7.  
  8. $dateititel2 = htmlentities($dateititel);
  9.  
  10. //TESTING///////////////////////////////////////
  11. echo $dateititel;
  12. echo "".$dateititel2;
  13. ///////////////////////////////////////////////
  14.  
  15. $sql = "UPDATE files SET cTitel='".$dateititel."' WHERE nFileID = ".$data["myFileID"];
  16. $rs = mysql_query($sql) or die ("Fehler beim Umbennen des Files!");
  17.  
  18. $this->writeHistory($sql,$_SESSION["myUserID"]);
  19.  
  20. $tpl->parse("TPL_ONLOAD_WHAT","load_error_overlay");
  21. $tpl->parse("TPL_ONLOAD", "onload");
  22.  
  23.  
  24. //$tpl->assign("TPL_ERROR_LIST", $errorList);
  25. $tpl->assign("TPL_ERROR", "Datei wurde erfolgreich umbenannt!");
  26.  
  27. //Weiterleitung um wieder saubere URL zu haben
  28. $host = $_SERVER['HTTP_HOST'];
  29. $uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
  30. $extra = "filemanager.php?uploadID=".$data["myUploadID"]."&openerFieldname=".$data["myOpenerFieldname"];
  31. $header = "http://".$host."".$uri."/".$extra;
  32. //header("Location: ".$header);
  33. //header("Location: filemanager.php?uploadID=".$data["myUploadID"]."&openerFieldname=".$data["myOpenerFieldname"]);
  34. }
Quelltext in Zwischenablage kopieren
Link zu diesem Beitrag in die Zwischenablage kopieren
ToM04
Gast

06.02.08
13:47 Uhr
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
Link zu diesem Beitrag in die Zwischenablage kopieren
phloo
Veteran

06.02.08
13:57 Uhr
direkt nach der mysql verbindung diesen Befehl ausführen:
  1. @mysql_query("SET NAMES utf8");
Quelltext in Zwischenablage kopieren

ggf mit utf8_decode arbeiten, aber das sollte nicht nötig sein und natürlich mit htmlentities.
Link zu diesem Beitrag in die Zwischenablage kopieren
Matze
Chefetage

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.
Link zu diesem Beitrag in die Zwischenablage kopieren
ToM04
Gast

06.02.08
14:10 Uhr
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
Link zu diesem Beitrag in die Zwischenablage kopieren
Matze
Chefetage

06.02.08
14:13 Uhr
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.
Link zu diesem Beitrag in die Zwischenablage kopieren
huschai
Gastarbeiter

06.02.08
16:59 Uhr
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.
Link zu diesem Beitrag in die Zwischenablage kopieren
ToM04
Gast

06.02.08
18:00 Uhr
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
Link zu diesem Beitrag in die Zwischenablage kopieren
 
#