# Umlaute werden falsch über PHP in die MySQL-Datenbank gespeichert



## LevFan (12. Februar 2008)

Hallo,

ich habe folgendes Problem und zwar will ich über PHP einen Datensatz in eine MySQL-Datenbank einfügen. Dieser Datensatz kann auch Umlaute enthalten. Wenn ich mir den zusammengesetzten SQL-String anzeigen lasse, zeigt der mir den richtigen Text an. Also Umlaute sind noch Umlaute. Kopiere ich mir den String nun und füge diesen von Hand in die Datenbank ein funktioniert alles wunderbar. Wenn ich den String jedoch mittels PHP absetzen will, schreibt PHP mir irgendwelche komischen Zeichen in die Tabelle.

Weiß eventuell jemand woran das liegt? Über Hilfe wäre ich sehr dankbar.

Gruß

Daniel


----------



## Loomis (12. Februar 2008)

Das hier hilft:

htmlspecialchars()
htmlentities()


----------



## Blackhawk50000 (12. Februar 2008)

wenn das, was du in die DB einfügen willst nicht auf der seite ausgegeben werden soll, dann kannst du die umlaute auch direkt also XML code schreiben ä = &auml; ü = &uuml;

versuchs mal


----------



## Gumbo (12. Februar 2008)

Es liegt an den unterschiedlichen verwendeten Zeichenkodierungen der einzelnen Systeme. Vermutlich stimmt die Eingabekodierung nicht mit der verwendeten Kodierung der Datenbank und/oder der Ausgabe nicht überein.

Welche Zeichenkodierung verwendest du denn?


----------



## Blackhawk50000 (12. Februar 2008)

ich muss hinzufügen das du den XML code glaube ich auch verwenden kannst wenn du das doch ausgeben willst....


----------



## LevFan (12. Februar 2008)

Gumbo hat gesagt.:


> Welche Zeichenkodierung verwendest du denn?



Ich verwende den Zeichensatz utf-8.


----------



## LevFan (12. Februar 2008)

Da ich die Datensätze später auch ausgeben muss und diese später auch noch bearbeitet werden sollen, kann ich leider nicht direkt den HTML-Code, wie z.B. &uuml;, in die Datenbank schreiben.


----------



## SpiderZLS (12. Februar 2008)

Du solltest deine Webanwendung in UTF-8 und deine DB auch in UTF-8 haben dann solltest du keine probs. mehr haben.


----------



## Gumbo (12. Februar 2008)

Wird diese Zeichenkodierung denn auch von der Datenbank benutzt und bei der Ausgabe korrekt angegeben?


----------



## LevFan (13. Februar 2008)

Danke für eure Hilfe.

Ich habe nun auch den Fehler gefunden. Es war alles richtig auf UTF-8 umgestelt, nur habe ich vor meine Ausgaben ein htmlentities($string) stehen. Das funktioniert bei UTF-8 allerdings nicht mehr so. Da muss es dann htmlentities($string,ENT_QUOTES,’UTF-8’) heißen.


----------



## Gumbo (13. Februar 2008)

Zudem brauchst bei UTF-8 du bis auf die HTML-Metazeichen keine anderen Zeichen durch Zeichenreferenzen zu ersetzen.


----------



## LevFan (13. Februar 2008)

Habe nun ein weiteres Problem und zwar soll aus einem in ein Formular eingegebenen String automatisch ein String ohne Sodnerzeichen erstellt werden, bzw. soll die Sonderzeichen ersetzt werden. Da die Eingaben des Formulars aber nun via UTF-8 geschehen, funktioniert meine Funktion nicht mehr, die z.B. aus einem ü ein ue macht. Der Grund dafür ist jetzt, dass die Sonderzeichen schon in dem String in UTF-8 sind. 

Gibt es eine PHP-Funktion mit der man Zeichen in UTF-8 umwandeln kann?


----------



## Gumbo (13. Februar 2008)

Bei UTF-8 musst du auch die UTF-8-Kodierungen der jeweiligen Zeichen nehmen. Das heißt entweder kodierst du auch die PHP-Skripte mit UTF-8 oder du gibst die Bitsequenzen einzeln an.
	
	
	



```
$trans = array(
	"\xC3\xA4" => 'ae',
	"\xC3\xB6" => 'oe',
	"\xC3\xBC" => 'ue',
	// …
);
```


----------



## LevFan (13. Februar 2008)

Und wie kodiert man ein PHP-Script mit UTF-8?


----------



## Gumbo (13. Februar 2008)

Das muss dein Editor können, der die Eingabe von der Tastatur direkt kodiert.


----------



## LevFan (13. Februar 2008)

Habe nun mal versucht die Zeichen zu ersetzen, was aber leider nicht funktioniert.


```
$text='Hier ist ein Text mit den Umlauten ä, ö und ü';
$zeichenliste=array(
"\xC3\xA4" => 'ae', 
"\xC3\xB6" => 'oe',
"\xC3\xBC" => 'ue');
$text=strtr($text,$zeichenliste);
echo $text;
```

Die Ausgabe sieht dann folgendermaßen aus:

Hier ist ein Text mit den Umlauten ä, ö und ü

Sie sollte aber ja so aussehen:

Hier ist ein Text mit den Umlauten ae, oe und ue

Was hab ich denn da jetzt wieder falsch gemacht?


----------



## Gumbo (13. Februar 2008)

Dass es funktioniert, setzt voraus, dass die Daten auch tatsächlich UTF-8-kodiert sind.


----------



## LevFan (13. Februar 2008)

Ich bekomme die Daten aus einem Formular das accept-charset="utf-8" hat. Also müssten diese doch UTF-8 kodiert sein oder?


----------



## Gumbo (13. Februar 2008)

Ja müssten sie. Probier doch mal Folgendes:
	
	
	



```
<?php

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

	if( $_SERVER['REQUEST_METHOD'] == 'POST' ) {
		$zeichenliste = array(
			"\xC3\xA4" => 'ae',
			"\xC3\xB6" => 'oe',
			"\xC3\xBC" => 'ue'
		);
		echo htmlspecialchars(strtr($_POST['foobar'], $zeichenliste));
	}

?>
<form action="" method="post" accept-charset="utf-8">
	<input type="text" name="foobar">
	<input type="submit">
</form>
```


----------



## LevFan (13. Februar 2008)

Danke für deine Hilfe. Nun funktioniert das auch.


----------



## Gumbo (13. Februar 2008)

Der Browser nimmt eigentlich als Zeichenkodierung für Formulardaten dieselbe Kodierung, mit der das Formulardokument ausgeliefert wurde. Deshalb solltest du durchgängig ein und dieselbe Kodierung nehmen und diese immer korrekt angeben.


----------



## LevFan (13. Februar 2008)

Ich nehme eigentlich die ganze Anwendung durch UTF-8. Der User soll aber später die Möglichkeit haben, Menüpunkte anzulegen. Wenn er diese über ein Formular anlegt, muss ich aus dem Titel zwei Strings in die Datenbank eintragen. Zum einen den Titel wie er eingegeben wurde um diesen später anzuzeigen und zum zweiten eine Variable die keine Sonderzeichen enthalten darf. Deshalb musste ich unter anderem aus dem UTF-8 String alle Sonderzeichen ersetzen.


----------



## starfoxfs (13. Februar 2008)

Mit http://www.php.net/utf8_encode und http://www.php.net/manual/de/function.utf8-decode.php geht das


----------



## brunlorenz (7. August 2011)

Ich weiss, das Thema ist schon alt, aber ich würde sagen, es freuen sich bestimmt einige, wenn es eine Antwort gibt: Probiert einfach mal bei PHPMyAdmin die Kollation in der Tabelle zu ändern. Bei mir geht es mit cp850_general_ci, da mein PHP-Script mit ANSI (Windows) kodiert ist. Wenn ihr ein UTF-8-Script habt, stellt den Zeichensatz der Tabelle auf utf8_general_ci.....
So könnt ihr ohne Probleme oder Konvertieren auf die Datenbank zugreifen.
Ich hoffe, das wird einigen helfen


----------

