Sonderzeichen in MySQL gehen irgendwie nicht :(

asylum

asylum

Aktives Mitglied
Thread Starter
Dabei seit
10.06.2005
Beiträge
746
Reaktionspunkte
1
'n abend!
Ich habe folgendes Problem aus dem ich nicht so wirklich rauskomme :(

Und zwar handelt es sich darum, dass ueber ein Forumlar Daten in die Datebank geschrieben werden. Wenn ich dann zb ä ö usw in die DB schreiben lasse, dann werden diese auch angezeigt, jedoch wenn ich dann den Eintrag aus der DB lade, dann sind anstatt der Sonderzeichen (ist so ziemlich alles, also Euro; " " oder ' ') so ein Sonderzeichen gedoens...

Woran kann das liegen?

Gruss

asylum

ps: die tables sind in Latin1!
 
Was ist Sonderzeichen Gedöns ??

Ist das dann im HTML oder sind die entsprechend schon in der DB so hinterlegt ?
 
asylum schrieb:
... so ein Sonderzeichen gedoens...

:p Schick doch mal ein Beispiel. Davon hängt die Lösung ab.
Zum Beispiel kannst Du im HTML-Dokument vorneweg noch ein META-Tag mit Angabe der Zeichenkodierung schicken.
Mit der Funktion htmlspecialchars kann man alle Zeichen in eine HTML-Schreibweise umkodieren.
Nicht zuletzt machen zwei Bytes am Anfang einer Datei gelegentlich gerne mal Problemchen, wenn es sich um UTF-kodierte Dateien handelt. Diese Bytes sollen genau dies dem Editor anzeigen. Der Editor sagt dann "aha", und zeigt dem User diese Bytes natürlich nicht unbedingt an.
 
2ndreality schrieb:
Ich würde die Dinger auch mit der PHP-Funktion htmlspecialchars vor dem Schreiben in die Datenbank umwandeln.

Das ist aber nur dann sinnvoll, wenn mit den Daten nicht weiter irgendwie gearbeitet werden soll. Wenn es ans Suchen und Sortieren in den Datenbankbeständen geht, stören die HTML-Schreibweisen. Für einfachere Sachen mag es noch gehen, wenn man auch die Suchanfragen entsprechend vorher umwandelt, aber elegant finde ich das nicht.
 
zb: möchte oder für
 
Aha. Guck mal nach, mit welcher Zeichenkodierung dein Editor dein PHP-Skript gespeichert hat.
 
wie mach ich das? bzw warum hat das was mit den skript zu tun? ich mache ja ne speicherung in die db per textfeld und lese dann aus der db raus in ein textfeld, dabei verhaut der eben die umlaute
 
Verwende beim Schreiben in die Datenbank einen string-/preq-replace und ersetze mit diesem alle ä, ö, ü ´s e.t.c. durch ä ö ....

Ich verwende die im Anhang enthaltene Funktion ;)
 
Zuletzt bearbeitet:
asylum schrieb:
bzw warum hat das was mit den skript zu tun? ich mache ja ne speicherung in die db per textfeld und lese dann aus der db raus in ein textfeld, dabei verhaut der eben die umlaute
Wenn die Zeichenkodierung Unicode ist, dann ist es nicht mehr so, daß 1 Zeichen gleich 1 Byte ist. Sondern je nach Variante werden 2 Byte für 1 Zeichen oder mehr benötigt. Wenn Du mit deinem Texteditor eine ganz einfache Textdatei anlegst und eben in Unicode-Kodierung speicherst, dann muß das irgendwie kenntlich gemacht werden. Woher soll der Editor denn beim erneuten Öffnen der Datei wissen, daß hier Unicode-Zeichen drin sind und ggf. 2 Bytes zu 1 Zeichen zusammenzufügen sind? Kenntlich gemacht wird das durch zwei Bytes am Anfang der Datei. Wenn der Editor die sieht, weiß er, daß es sich um Unicode handelt. Diese Bytes zeigt er aber natürlich nicht an, weil sie ja kein eigentlicher Inhalt sind. Du siehst sie nur, wenn Du ihm sagst, daß es eben nicht Unicode ist. Die Kodierung legt man über einen Menüpunkt oder innerhalb des Speicherndialogs fest. Ich weiß nicht, welchen Editor du nimmst.
Im Prinzip ist die Kodierung eigentlich egal. Aber bei meinen Skripten schicke ich immer noch eine META-Tag-Angabe über die verwendete Kodierung z.B.
Code:
<meta http-equiv="type" content="text/html; charset=utf-8">
mit. Denn der Browser muß auch wissen, wie das ankommende Dokument kodiert ist und er schickt die eingegebenen Daten in genau dieser Kodierung dann auch zurück.
Interessanterweise müssen dann aber wiederum diese Bytes, an denen der Editor das erkennt, nicht mehr mitgeschickt werden. Diese Erkenntnis ist wichtig, wenn man mit PHP selbst noch Header-Infos mitschicken will. Das geht nämlich (logischerweise) nicht, wenn diese Bytes ganz am Anfang stehen.
 
Nik13 schrieb:
Verwende beim Schreiben in die Datenbank einen string-/preq-replace und ersetze mit diesem alle ä, ö, ü ´s e.t.c. durch &auml; &ouml; ....
Diese Funktion gibt's aber schon: eben htmlentities und htmlspecialchars ;)
 
Hi,

deine Datenbank ist vermutlich auf UTF-8 statt auf ISO-8859-1 eingestellt. Stell das ggf mal um in phpMyAdmin. Du kannst auch in PHP für die Verbindung selbst das Charset einstellen, falls das nichts hilft, oder die Daten konvertieren.

cu
 
Mhh ok danke fuer die vielen Antworten, jetzt weiss ich zwar mehr, aber leider nicht ganz genau was ich nun tun muss...

also im header steht:
PHP:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

in der db steht als fuer diese Tabelle:
PHP:
 Collation  	 latin1_swedish_ci

mfg
 
latin1_swedish_ci ist nicht das problem. das kannst du so lassen.

probiere eine utf8-dekodierung der ausgabe von php.

anstelle von:

echo $text;

schreibst du:

echo utf8_decode($text);
 
Rajmund schrieb:
Das ist aber nur dann sinnvoll, wenn mit den Daten nicht weiter irgendwie gearbeitet werden soll. Wenn es ans Suchen und Sortieren in den Datenbankbeständen geht, stören die HTML-Schreibweisen. Für einfachere Sachen mag es noch gehen, wenn man auch die Suchanfragen entsprechend vorher umwandelt, aber elegant finde ich das nicht.

Ich entwickle hauptsächlich einfachere Sachen für das Web, deswegen bin ich wahrscheinlich fern dieser Komplexität (was ich nicht ironisch oder sarkastisch meine).

Mich würde interessieren, was Du mit dem weiteren Bearbeiten der Daten meinst. Also was für Applikationen für welchen Anwendungsbreich?

2nd
 
Eine Speicherung der Texte in der HTML-Schreibweise ist dann hinderlich, wenn man z.B. nicht nur HTML als Ausgabeformat hat.

Das ist z.B. der Fall, wenn man Inhalte auch per Mail weiterleitbar machen möchte (wie z.B. im Newsticker von Heise) oder aber gespeicherte Daten als Excel-Tabelle rausrechnen will.

Und natürlich bei Datenbankvolltextsuchen. Bei einer Suche müsste man das Suchwort nach HTML konvertieren, damit es gefunden werden kann.

Pauschal kann man sagen, dass man immer besser fährt, wenn man die Inhalte möglichst medienneutral speichert. Als Kodierung bietet sich UTF8 an, da dieses Format praktisch alle gängigen Weltsprachen abbilden kann (http://de.wikipedia.org/wiki/UTF8).
 
Ok, danke für die Information, gut zu wissen :)

Medienneutrales Arbeiten und Unicode ist ein gutes Stichwort.

2nd
 
danke schon @ all fuer die Hilfe!!!
catvarlog schrieb:
latin1_swedish_ci ist nicht das problem. das kannst du so lassen.

probiere eine utf8-dekodierung der ausgabe von php.

anstelle von:

echo $text;

schreibst du:

echo utf8_decode($text);

ich habe jetzt, wie du vorgeschlagen hast, ein decode vor den text gehaun:
PHP:
  $output .= "<input type='text' name='title' value='".stripslashes(utf8_decode($product['name']))."' />";

wenn ich jetzt jedoch die Daten nochmal zum Editieren lade, also aus der DB hole, erhalte ich fuer 'für' -> 'f?r' :(
 
Dann liegen die Texte in der DB nicht in UTF8 vor.

Solltest du selber für die Inhalte zuständig sein - also die Daten mit deiner Anwendung in die DB schreiben - dann mach vor dem Schreiben in die DB eine Konvertierung nach UTF8.

aus $_REQUEST['titel'] wird dann utf8_encode($_REQUEST['titel']) - achtung: hier heißt es encode und nicht decode.

Es ist etwas schwierig, dir da zu helfen. Ich weiß nicht genau, in welchem Format deine Daten in der DB liegen. Aber eine Kodierung beim Schreiben in die DB und eine Dekodierung beim Lesen aus der DB sollte funktionieren.
 
Super! Jetzt geht alles :) Vielen vielen Dank!!!
 
Zurück
Oben Unten