HTML Zeichen ersetzen ?
Joachim
- php
Hi ihr,
ich hab ein dringendes Problem und zwar hab ich einige tausend Datensätze in einer mysql Datenbank gespeichert, jetzt sind da teilweise bei bestimmten Namen etc "Fehler" aufgetreten. Und zwar werden einige Zeichen (die so glaube ich nicht im deutschen ISO Standart liegen oder wie das auch immer heißen mag) komisch abgespeichert in dieser Form "ę" beispielweise für dieses "ę" mit nem "kringel" unten dran (kein Plan wie das heißt). Beim Aufruf wandelt mir das Script jedoch dies auch nicht mehr in das entsprechende "ę" um sondern schreibt mir halt den Namen mit diesen "ę" aus was dann beispielsweise so aussieht: "Dębiec" anstatt "Dębiec" wie kann ich dies jetzt wieder so formatieren, dass mir meine "kringel-e" wieder entgegenlacht ???
Hab bereits eingies mit ereg_replace probiert aber funzt net,... wie geht es dennoch ???
Ich hoffe Ihr habt nen Plan ich bin nämlich total überfordert (was auch schnell der fall ist hab nämlich nicht allzuviel Ahnung und finde im php-manuel nix passendes)...
danke
Gruß Joachim
Und zwar werden einige Zeichen (die so glaube ich nicht im deutschen ISO Standart liegen oder wie das auch immer heißen mag)
ISO-8859-1 (Westeuropäisch) oder ISO-8859-15 (Westeuropäisch mit Eurozeichen) heißen die Dinger.
komisch abgespeichert in dieser Form "ę" beispielweise für dieses "ę" mit nem "kringel" unten dran (kein Plan wie das heißt).
Die 281 ist die Nummer des Zeichens in der Unicode-Tabelle. Die ISO-8859-Tabellen können nur 256 Zeichen aufnehmen (8 Bit), was, wie Du jetzt bemerkst, zu Problemen führt, wenn verschiedene Sonderzeichen benutzt werden.
Unicode löst das Problem mit einer 32-bittigen Tabelle.
Das ę dürfte auch nicht von MySQL verbrochen worden sein, sondern von einem Webbrowser beim Absenden des Formulars. Du kannst HTML-Formularen mit dem Attribut accept-charset sagen, welchen Zeichensatz sie verwenden dürfen. In diesem Forum wird das so gemacht.
Beim Aufruf wandelt mir das Script jedoch dies auch nicht mehr in das entsprechende "ę" um sondern schreibt mir halt den Namen mit diesen "ę" aus was dann beispielsweise so aussieht:
Wenn es nur um die HTML-Ausgabe geht: Sorge dafür, dass die jeweilige Seite die genutzte Zeichentabelle ausspuckt (etwa mit 'header("Content-Type: text/html; charset=iso-8859-1");' ) und gib die Daten direkt aus, ohne Verwendung von htmlentities(). Sofern der Browser Unicode kann, wird er aus dem ę im HTML-Quelltext wieder ę machen, so wie er aus ü ein ü machen würde.
Probiere unbedingt, ob es mit dem Eurozeichen klappt! Andernfalls ändere die Zeichensatzangabe, zum Beispiel auf iso-8859-15 oder windows-1252.
Wenn es darum geht, die Daten auch in MySQL zu korrigieren: Du wirst Dich wohl oder übel mit utf-8 beschäftigen müssen, einer Kodierung, mit der 32-bittige Unicode-Werte unfallfrei in herkömmliche 8-Bit-Blöcke umgesetzt werden. Es ist nicht allzu schwer, der Algorithmus ist unter http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 erklärt. Suche im jeweiligen Datensatz a) nach Bytes, die größer 127 sind und b) nach Zeichenketten in der Form &nnn;. Bei a) nimmst Du den Bytewert, bei b) die ausgeschrieben Zahl nnn, kodierst dies entsprechend utf-8 und speicherst das Ergebnis im Datensatz.
Sofern der Browser Unicode kann, wird er aus dem ę im HTML-Quelltext wieder ę machen,
Jaja, ę... Das mit den Browsern, Formularen und Unicode klappt hier offensichtlich doch noch nicht so dolle.
Hallo ihr da draußen,
[...]
Wäre es nicht viel einfacher, die Daten mit html_entity_decode() (http://php.net/html_entity_decode) zu konvertieren?
Grüße von hier drinnen, aus Biberach an der Riss (http://www.stadt-biberach.de/),
Candid Dauth (Dogfish)
Wäre es nicht viel einfacher, die Daten mit html_entity_decode() (http://php.net/html_entity_decode) zu konvertieren?
Sofern ihm das zur Verfügung steht, kann er damit die &-Sequenzen nach utf-8 umwandeln, muss dann aber immer noch sämtliche Bytes zwischen 128 und 255 (deutsche Umlaute und vieles mehr) selbst konvertieren, da auch diese Zeichen nicht in utf-8 als solche, sondern als Zwei-Byte-Worte vorkommen.
Bei der Ausgabe dieses Textes in HTML sollte dann wiederum htmlentities() mit entsprechender utf-8-Angabe angewandt werden, zumindest aber htmlspecialchars() in Verbindung mit der Angabe utf-8 in Content-Type (was allerdings bedeutet, dass auch der gesamte Rest der Seite in utf-8 sein muss).
Hallo!
... Du kannst HTML-Formularen mit dem Attribut accept-charset sagen, welchen Zeichensatz sie verwenden dürfen. In diesem Forum wird das so gemacht.
Ich mag fragen, was dieses accept-charset bewirkt. OK, der Name des Attributes sagt schon einiges aus, aber was bewirkt es wirklich? Enthalten die submit-Daten alle, nur die "anderen", Zeichen nicht?
Wird das Attribut von älteren Browsern auch verwendet oder betrifft es ohnehin den Server?
Beste Grüße
Viennamade
Ich mag fragen, was dieses accept-charset bewirkt.
Die Formulardaten werden vom Browser in einem der angegebenen Zeichensätze an den Server geschickt. Allerdings wird bei mehreren Alternativen (etwa "iso-8859-1,utf-8") nicht nach einem einheitlichen Schema ausgewählt und es scheint darüber hinaus auch keinen Browser zu geben, der sagt, welchen Zeichensatz er verwendet.
Es ist deshalb ratsam, eine Vorschaufunktion oder sonst eine Möglichkeit, die eingegebenen Daten später nochmals zu ändern, anzubieten. Damit wäre dann auch das Problem mit Browsern, die accept-charset überhaupt nicht unterstützen, umschifft.
oder betrifft es ohnehin den Server?
Nein, der Server hat mit der Bekanntgabe der von ihm akzeptierten Zeichensätze seinen Teil erledigt und kann nur hoffen, dass der Browser damit umgehen kann. Eine genaue Untersuchung der empfangenen Formulardaten ist unerlässlich.
Hallo!
Danke für Deine Erklärungen zum Thema accept-charset in Deinem Posting auf welches ich hier antworte!
Ich kenne mich aus!
Viennamade
Ich korrigiere mich:
Wenn es nur um die HTML-Ausgabe geht: Sorge dafür, dass die jeweilige Seite die genutzte Zeichentabelle ausspuckt (etwa mit 'header("Content-Type: text/html; charset=iso-8859-1");' ) und gib die Daten direkt aus, ohne Verwendung von htmlentities().
Das funktioniert so nicht. Werden die Daten direkt ausgegeben, kann man HTML-Code einschmuggeln, der ungeprüft in den Seiten landet. Eine Absicherung mittels htmlspecialchars() hilft auch nicht, da dann das einleitende Und der &-Sequenzen ebenfalls "entschärft" wird und statt des Zeichens wieder der Text ę im Browser zu sehen ist. Die alleinige Ersetzung von < und > durch < und > hilft ebenfalls nicht, da dann die tatsächlichen Unds ("Otto & Karl") nicht umgesetzt werden.
Mach' also Nägel mit Köpfen und konvertiere die Daten direkt in der Datenbank (sowie bei der Verarbeitung von Formulareingaben) in utf-8.
Hello,
weißt Du denn schon, was da WIRKLICH in der Datenbank drinsteht? Vielleicht ist das Ganze ja doppelt codiert worden? Man müsste also erstmal eine Real-Darstellung (z.B. in Hexcode) vom Inhalt der Datensätze haben.
Da wird dan nur ein Datensichttool helfen, mit dem man sich jeden suspekten Satz auf den Schirm holt und im zweifelsfall den Knopf drückt, der die Konvertierung bewirkt, dann wieder schauen..., und wenn es passt, wieder abspeichern. Als Filterkriterium wird sicher das Ampers-And helfen können.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom