Sven Wagener: Umlaute ersetzen

Hallo zusammen,

ich will Daten aus einer Datenbank auslesen und die Umlaute ä, ö ü etc. gegen ae, oe und ue austauschen. Das mache ich eigentlich so:

  
$string=str_replace("ä","ae",$string);  
$string=str_replace("ö","oe",$string);  
$string=str_replace("ü","ue",$string);  
	  
$string=str_replace("Ä","Ae",$string);  
$string=str_replace("Ö","Oe",$string);  
$string=str_replace("Ü","Ue",$string);  

Allerdings werden die Umlaute einfach nicht ausgetauscht. Es werden zwar Leerzeichen und andere Zeichen ausgetauscht, allerdings nicht die Umlaute.

Die Kollation für dieses Feld in MySQL ist auf "latin1_swedish_ci" gestellt, allerdings hat auch ein Umstellen auf "latin1_german2_ci" umgestellt und es funktioniert immer noch nicht.

Hat jemand eine Idee?

Sven

  1. Mahlzeit,

    Allerdings werden die Umlaute einfach nicht ausgetauscht. Es werden zwar Leerzeichen und andere Zeichen ausgetauscht, allerdings nicht die Umlaute.

    Dann solltest du den Code posten, den du verwendest. Bei deinem wird keinerlei Leerzeichen oder anderer Code ersetzt.

    Die Kollation für dieses Feld in MySQL ist auf "latin1_swedish_ci" gestellt, allerdings hat auch ein Umstellen auf "latin1_german2_ci" umgestellt und es funktioniert immer noch nicht.

    Du postest PHP-Code und sprichst dann von MySQL? Du solltest dich erstmal entscheiden, wo du was machen willst, das eine hat mit dem anderen nichts zu tun.

    1. Dann solltest du den Code posten, den du verwendest. Bei deinem wird keinerlei Leerzeichen oder anderer Code ersetzt.

      Der Code ist zur Verdeutlichung auch irrelevant. Die eine Zeile kann man sich auch dazu denken. Sie funktioniert ja.

      Du postest PHP-Code und sprichst dann von MySQL? Du solltest dich erstmal entscheiden, wo du was machen willst, das eine hat mit dem anderen nichts zu tun.

      Ich weis nicht ob die Codierung aus MySQL etwas damit zu tun hat. Das war lediglich eine Zusatzinformation. Zu entscheiden gibt es da nichts, wo ich was machen will, denn PHP greift auf MySQL zu und hat damit schon sehr viel damit zu tun.

  2. echo $begrüßung;

    ich will Daten aus einer Datenbank auslesen und die Umlaute ä, ö ü etc. gegen ae, oe und ue austauschen. [...] Allerdings werden die Umlaute einfach nicht ausgetauscht.

    Dann liegen die vom DBMS kommenden Umlaute in einer anderen Kodierung vor als die, die in deinem Script stehen. Lass die die Daten aus dem DBMS und auch die im Script notierte Strings mit bin2hex() in Hexwerte wandeln und gib diese aus. Du wirst dann Unterschiede feststellen können.

    Die Kollation für dieses Feld in MySQL ist auf "latin1_swedish_ci" gestellt, allerdings hat auch ein Umstellen auf "latin1_german2_ci" umgestellt und es funktioniert immer noch nicht.

    Die Kollationsangabe (das ist der Teil swedish_ci und german2_ci) hat keinen Einfluss auf die Kodierung der Zeichen. Die bleiben in deinem Fall immer Latin1-kodiert. Wenn du allerdings mit MySQL kommunizierst hast du eine Client-Verbindung und für die kann eine eigene Kodierung festgelegt werden. Dies sollte auch gemacht werden, damit beide Seiten ausdrücklich Bescheid wissen und nicht nur durch Zufall die gleiche Kodierung verwenden. Um die Verbindungskodierung festzulegen kann man nach jedem Verbindungsaufbau ein mysql_set_charset() aufrufen oder zur Not ein "SET NAMES"-Statement absetzen.

    Der MySQL-Server kodiert alle Daten aus den Feldern in die Verbindungskodierung um und umgekehrt.

    Zwei Lösungsvorschläge: Die Verbindungskodierung solltest du immer aushandeln. Und du musst dir Gedanken machen, in welcher Kodierung die Daten in deinen Scripten vorliegen und welche du mit dem Browser. Wenn du alles richtig gemacht hast, hat sich dein Problem in Luft aufgelöst. Andererseits kannst du mit bin2hex() erstmal das Problem genauer analysieren und erst anschließend den ersten Vorschlag umsetzen.

    echo "$verabschiedung $name";

    1. Hallo Dedlfix,

      ich habe die Codierung jetzt per mysql_set_charset eingestellt und "ISO-8859-15" genommen. Stelle ich sie auf UTF8 um, stimmt der Rest der Codierung auf der Seite nicht mehr.

      Allerdings will der die Umlaute immer noch nicht ersetzen. Im Internetexploter bleibt das ü ein ü und im Firefox Quelltext wird es als

      %C3%BC

      dargestellt. Wenn ich mir den String per bin2hex ausgebe, sehe ich nur noch Zahlen und Buchstaben in einer Reihe, die mir im Moment noch nicht viel sagen. Muss ich die Zahlen paarweise lesen?

      Sven.

      1. echo $begrüßung;

        Allerdings will der die Umlaute immer noch nicht ersetzen. Im Internetexploter bleibt das ü ein ü und im Firefox Quelltext wird es als %C3%BC dargestellt.

        Das ist aber eine URL-Kodierung, die nicht im direkten Zusammenhang mit dem Ersetzungsversuch steht.

        Wenn ich mir den String per bin2hex ausgebe, sehe ich nur noch Zahlen und Buchstaben in einer Reihe, die mir im Moment noch nicht viel sagen. Muss ich die Zahlen paarweise lesen?

        Ja, zwei Ziffern (inklusive A..F) ergeben ein Byte. Unter ISO-8859-x entspricht jedes Byte einem Zeichen. Eine Tabelle für ISO-8859-15 steht unter anderem in der Wikipedia. Die Bytes 00..7F sind immer gleich. Die Unterschiede zwischen den ISO-8859-Kodierungen gibt es auch in übersichtlicher Form.

        Du kannst statt bin2hex() auch urlencode() nehmen, dann werden nur Sonderzeichen und Zeichen oberhalb von 7F als Bytewerte drgestellt.

        echo "$verabschiedung $name";