# Umlaute in DB nicht korrekt (UTF8)



## deb_ugger (8. November 2006)

Hallo zusammen,

ich habe meine Seite komplett in UTF-8 erstellt.

```
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
```
Auch die mysql-Datenbank verwendet die Kollation "utf8_general_ci".

Dennoch werden meine Sonderzeichen in der Datenbank falsch dargestellt, beispielsweise wir aus "ü" --> "Ã¼". Normal ist das nicht, oder?

Speziell bei einer Datenbank-Abfrage habe ich dann nämlich das Problem, dass Begriffe mit Sonderzeichen nicht gefunden werden.

Kann mir da jemand helfen?

Danke!


----------



## Radhad (9. November 2006)

Ich habe das selbe Problem. Zuerst klappte alles wunderbar, jetzt werden Umlaute durch ? oder Kästchen ersetzt (in der Ausgabe).

Ich suche jetzt eine Funktion, die vor dem Speichern der Daten Die Umlaute ersetzt durch z.B. & Auml ;.

Hier mein Ansatz, der aber nicht klappt:

```
<?php
$text = "Hallo RädhÄd. Dies ist ein Text mit Umlauten 'löl' ß";
$umlaute("ä","ö","ü","ß","Ä","Ö","Ü");
$encodedumlaute("&auml;","&ouml;","&uuml;","&szlig;","&Auml;","&Ouml;","&Uuml;");
$ecnodedtext = str_replace($umlaute,$encodedumlaute,$text);
echo $encodedtext;
?>
```
Hat jemand vielleicht schonmal sowas gemacht? Mein Fehler scheint zu sein, dass ich bei str_replace als 2. Parameter kein Array nehmen darf :/


Gruß Radhad


----------



## deb_ugger (9. November 2006)

Sollte ich die UTF8-Sache richtig verstanden haben, sollten ja die Sonderzeichen *ohne *Probleme *richtig *in der Datenbank gespeichert werden, oder? Ohne die Verwendung von replace-Funktionen und weiß Gott was alles --> das machts dann ja wieder ziemlich umständlich finde ich.

Hat jemand eine Idee, woran das liegen kann?
Oder muss ich hier dennoch *utf8_encode()* bzw. *ut8_decode()* verwenden?


----------



## Radhad (9. November 2006)

Das habe ich auch gedacht, aber mir fällt sonst keine plausible Lösung ein :/


----------



## zeja (9. November 2006)

Man muss bei der Verbindung zur Datenbank dieser mitgeben dass sie UTF-8 fähig sein soll.

Steht alles im Manual:
Using Character Sets and Unicode und
Unicode Support


----------



## EvilO (9. November 2006)

Falls du MySQL benutzt sollte dies Abhilfe schaffen, einfach direkt als erste Queries zur Datenbank schicken:


```
"SET NAMES 'utf8'"
"SET CHARACTER SET 'utf8'"
```

Und am besten noch folgenden Header in PHP senden:


```
header('Content-Type: text/html; charset=UTF-8');
```


----------



## Gumbo (9. November 2006)

Die Angabe der verwendeten Zeichenkodierung im HTTP-Header ist sogar notwendig.


----------



## Radhad (9. November 2006)

Wie sehen die header denn dann aus?


----------



## Gumbo (9. November 2006)

EvilO hat gesagt.:


> Und am besten noch folgenden Header in PHP senden:
> 
> 
> ```
> ...


Einfach das „am besten“ streichen.


----------



## Radhad (9. November 2006)

Jetzt bekomme ich XML-Fehler mit dem & Zeichen, wenn es nicht als & amp ; geschrieben wurde. Ist das normal? Ich habe statt text/html text/xml gewählt.

Außerdem: ö wird als ? angezeigt. Siehe Link Bei rFactor Spalte Letzter Beitrag - "was mir pers?nlich am editor noch fehlt" das ? steht in der MySQL DB als ö drin. Beim validieren für XHTML bekomme ich auch an der Stelle den Fehler: Validate!



Gruß Radhad

Nachtrag: Hab die SET-Routine vergessen. Jetzt geht es!


----------



## Radhad (9. November 2006)

Wie kann ich verhindern, dass ' " etc. escaped werden?

Ok, die Lösung war die Funktion stripslashes() vor dem speichern in die MySQL Datenbank. Ich glaub das liegt an dem WYSIWYG Editor, der HTML benutzt. Falls jemand einen Editor für Textnachrichten mit BB-Code kennt, der leichtz u handhaben ist (ohne große Einarbeitungszeit), der kann mir mal eine PN dazu schicken. Wäre sehr nett, denn leider spuckt Google zu dem Thema so viel mist aus, so dass man selbst nach ner Stunde langsam verzweifelt. Auf der Seite http://www.geniisoft.com/showcase.nsf/WebEditors habe ich auch mal geschaut, aber ich will keinen mit irgendnem komischen Framework dahinter (versteh ich eh nicht) ...


Gruß Radhad


----------



## Online-Skater (10. November 2006)

EvilO hat gesagt.:


> Falls du MySQL benutzt sollte dies Abhilfe schaffen, einfach direkt als erste Queries zur Datenbank schicken:
> 
> 
> ```
> ...



Kann man auch irgendwie global für alle Tabellen das in php-myadmin einstellen die Codierung hab schon gesucht und nichts gefunden, bei mir wird das alles in latin_swedish oder so abgespeichert... Und alle Datensätze einzel zu ändern ist sehr aufwendig.

mfg


----------



## Radhad (10. November 2006)

Bei mir war die DB auf "utf8_unicode_c1" gesetzt. Trotzdem hat der alle Tabellen & Textspalten als "latin1_general_ci" erstellt. Hab sie aber noch nicht alle per Hand geändert :/ Die Tabellen schon, aber die Spalten muss ich auch einzeln ändern *grml*


----------



## deb_ugger (10. November 2006)

Hallo!

Ich habe jetzt nach meiner DB-Connection folgende Query eingebaut:

```
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET 'utf8'");
```

Zusätzlich habe ich mit

```
header('Content-Type: text/html; charset=utf-8');
```
den Charset auf utf8 gestellt.

Und es funktioniert! Die Umlaute werden richtig in der DB gespeichert.
Wers braucht: Wenn man für URLs jetzt Sonderzeichen umwandeln möchte, kann man folgendermaßen vorgehen:

```
function chkChar($string){
		$string = mb_strtolower($string, 'UTF-8');
		$string = str_replace("ä","ae",$string);
		$string = str_replace("ü","ue",$string);
		$string = str_replace("ä","oe",$string);
		$string = str_replace("á","a",$string);
		$string = str_replace("à","a",$string);
		$string = str_replace("é","e",$string);
		$string = str_replace("è","e",$string);
		$string = str_replace("ß","ss",$string);
		$string = str_replace(" ","-",$string);
		$string = str_replace(".","ss",$string);
		$string = str_replace('/',"-",$string);
		$string = str_replace("&","-und-",$string);
		$string = str_replace('"',"",$string);
		return $string;
	}
```

mfg


----------



## deb_ugger (10. November 2006)

Da habe ich mich wohl zu früh gefreut.

Jetzt werden die Umlaute in der Datenbank als Fragezeichen ausgegeben...

Kann mir da jemand weiterhelfen?


----------



## Gumbo (10. November 2006)

Nun bisher hast du nur von der Ausgabe der Daten gesprochen. Wie sieht es denn mit der Eingabe der Daten aus? Sind die Eingabedaten denn auch UTF-8-kodiert?


----------



## deb_ugger (10. November 2006)

Also bei der Eingabe der Daten gehe ich folgendermaßen vor. Ich verwende:

```
header('Content-Type: text/html; charset=utf-8');
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET 'utf8'");
```

Die Datenbanken sind "utf8_general_ci".
Die Umlaute in der Datenbank werden auch als solche in phmyadmin angezeigt.

Lediglich bei der Ausgabe erscheinen diese Fragezeichen. Mach ich was falsch?


----------



## Gumbo (10. November 2006)

Dass du die Ausgabedaten als UTF-8-kodiert klassifizierst, heißt noch lange nicht, dass auch die Eingabedaten UTF-8-kodiert waren.


----------



## liquidbeats (17. März 2007)

EvilO hat gesagt.:


> ```
> "SET NAMES 'utf8'"
> "SET CHARACTER SET 'utf8'"
> ```


Das wars. Habe knapp 2 Stunden nach der ursache gesucht. Ich Danke dir. Perfekt!

Schönes Wochende wünsch ich noch 

Grüße


----------



## DemDoggy (17. März 2007)

Ich denke das es an der Apache Einstellung liegt.
Das der Default Charset auf Latin 1 steht.

Trotzalledem würde ein Convert des Values für die DB funktionieren..


```
function makeutf8( $value )
  {
	$value  = str_replace("\\\"" , "\"" , $value) ;		
	return mb_convert_encoding($value,"UTF-8","LATIN1");
  }
```

Diese Funktion nutze ich selbst um Latin1 in UTF8 zu Konvertieren (für XML).

Der header('Content-Type: text/html; charset=utf-8'); bezieht sich in diesen fall 
auf die Kodierung des Browsers und hat keinerlei wirkung auf MySQL-Connection.


Evtl. Hilft dir das ja..

Doggy


----------



## daN-the-man (17. März 2007)

Ich habe nen ähnliches Problem.

In meinen Scripten habe ich über den Meta-Tag auf UTF-8 kodierung gestellt, die Scripte im Editor benutzen auch UTF-8, und die Tabellen sind ebenfalls so eingestellt. Wenn ich über meine Anwendung was in die Datenbank schreibe bzw was auslese, wird alles korrekt angezeigt. Auch wenn ich über die Shell mir Datensätze anzeigen lasse, werden die Umlaute korrekt angezeigt. Wenn ich mir allerdings alles in PHPMyAdmin anzeigen lasse, werden die Umlaute dort nicht korrekt angezeigt, und wenn ich über PMA was in der Tabelle änder, wird in der Anwendung und der Shell alles falsch angezeigt.

Kennt einer das Problem? Ich habe in PMA definitiv UTF-8 Kodierung eingestellt.


----------



## DemDoggy (17. März 2007)

Ich würde sagen, dass es ein Browser Problem ist.
Wie ist die Kodierung der Seitet?

Sollte es ISO-8859-1 sein - dann gibt PHPMyAdmin kein richtigen UTF8 Header aus.

Ich Persönlich arbeite immer mit dem Latin-Schriftsatz...
und bei bedarf konvertiere ich es zu UTF-8...

Damit fahre ich ganz gut - und habe weniger Probleme...


----------

