Zeichensätze - Ungültige Zeichen auf Wikipedia?
Cytrox
- sonstiges
Hi,
auf der Wikipedia Seite http://de.wikipedia.org/wiki/Englische_Sprache befinden sich ein paar zeichen die mysql (verbindung und db sind alle auf utf8) dazu veranlassen diesen fehler zu melden:
Incorrect string value: '\xF0\x90\x8C\xB0\xF0\x90...'
ich weiß leider nicht genau welche zeichen es sind, aber im wikimarkup (auf "seite bearbeiten" gehen) sind es die zeichen die nach "[[got:" folgen:
[[got:𐌰𐌲𐌲𐌹𐌻𐌰𐍂𐌰𐌶𐌳𐌰]]
sind die zeichen irgendwie ungültig? oder liegt die schuld an mysql? irgendwie komisch, da wikipedia ja selbst mysql verwendet (oder?)
was kann ich da machen?
auf der Wikipedia Seite http://de.wikipedia.org/wiki/Englische_Sprache befinden sich ein paar zeichen die mysql (verbindung und db sind alle auf utf8) dazu veranlassen diesen fehler zu melden:
was kann ich da machen?
ich drücks mal so aus WTF? - ich hab keinen plan, was du willst oder vorhast
die wikipedia-seite funktioniert bei mir einwandfrei
im übrigen: wenn du von der wikipedia content-grabbing betreibst, hüte dich, das direkt von den http-servern zu tun - wikimedia stellt dafür schnittstellen bzw mysql-dumps zur verfügung, wenn du an die daten willst
ich drücks mal so aus WTF? - ich hab keinen plan, was du willst oder vorhast
wenn man das wiki-markup von der seite in mysql einfügt, dann kommt der vorhin genannte fehler...
die wikipedia-seite funktioniert bei mir einwandfrei
bei mir im browser auch
wenn man das wiki-markup von der seite in mysql einfügt, dann kommt der vorhin genannte fehler...
wie fügst du wiki-markup in mysql ein?
wie fügst du wiki-markup in mysql ein?
pstmt.setString(2, wm);
das datenbankfeld ist longtext
pstmt.setString(2, wm);
ist das nicht postgresql und sagtest du nicht mysql?
pstmt.setString(2, wm);
ist das nicht postgresql und sagtest du nicht mysql?
es ist java und pstmt ist ein PreparedStatement - die datenbank dahinter ist mysql
es ist java und pstmt ist ein PreparedStatement - die datenbank dahinter ist mysql
gut - von java hab ich nicht wirklich eine ahnung ;) aber es könnte wohl daran liegen, dass wiki-markup für fett und kursiv '' bzw ''' ist, wenn das nicht escaped ist, könnte das zu fehler führen
Moin!
es ist java und pstmt ist ein PreparedStatement - die datenbank dahinter ist mysql
gut - von java hab ich nicht wirklich eine ahnung ;) aber es könnte wohl daran liegen, dass wiki-markup für fett und kursiv '' bzw ''' ist, wenn das nicht escaped ist, könnte das zu fehler führen
Aber nicht in einem Prepared Statement - das ist ja der Witz des ganzen.
- Sven Rautenberg
echo $begrüßung;
auf der Wikipedia Seite http://de.wikipedia.org/wiki/Englische_Sprache befinden sich ein paar zeichen die mysql (verbindung und db sind alle auf utf8) dazu veranlassen diesen fehler zu melden:
Incorrect string value: '\xF0\x90\x8C\xB0\xF0\x90...'
ich weiß leider nicht genau welche zeichen es sind, aber im wikimarkup (auf "seite bearbeiten" gehen) sind es die zeichen die nach "[[got:" folgen:
[[got:𐌰𐌲𐌲𐌹𐌻𐌰𐍂𐌰𐌶𐌳𐌰]]
sind die zeichen irgendwie ungültig?
Das sind gotische Zeichen, die in Unicode jenseits der Basic Multilingual Plane liegen, also Werte oberhalb von 0xFFFF haben.
oder liegt die schuld an mysql?
MySQL unterstützt nur die BMP: Unicode Support
irgendwie komisch, da wikipedia ja selbst mysql verwendet (oder?)
Vielleicht betreiben die ihre Felder nicht mit einer UTF-8-Kodierung.
was kann ich da machen?
Verwende den Feldtyp VARBINARY oder VARCHAR mit CHARACTER SET BINARY (was VARBINARY ergibt). Das hat aber den Verlust der UTF-8-Unterstützung für dieses Feld zur Folge, sprich: String-Operationen orientieren sich nicht mehr an den UTF-8-Byte-Sequenzen sondern denken 1 Byte = 1 Zeichen.
echo "$verabschiedung $name";
Das sind gotische Zeichen, die in Unicode jenseits der Basic Multilingual Plane liegen, also Werte oberhalb von 0xFFFF haben.
Endlich mal jemmand der sich auskennt... Bin gestern im IRC alle möglichen Channels von #java über #mysql zu #wikipedia und #wikimedia-tech rauf und runter gelaufen, keiner wusste so recht was los ist...
Danke für deine Antwort!
oder liegt die schuld an mysql?
MySQL unterstützt nur die BMP: Unicode Support
Ich hatte schon vermutet das es daran liegt dass die nur max. 3 statt max. 4 Bytes pro Zeichen verwenden, aber das irgendwie zu überprüfen/"beweisen" hab ich nicht geschafft :\
Vielleicht betreiben die ihre Felder nicht mit einer UTF-8-Kodierung.
Wenn man bedenkt das die gesamte Seite auf UTF-8 ist, wär das doch irgendwie komisch das da die Datenbank nicht mitmacht...
Verwende den Feldtyp VARBINARY oder VARCHAR mit CHARACTER SET BINARY (was VARBINARY ergibt). Das hat aber den Verlust der UTF-8-Unterstützung für dieses Feld zur Folge, sprich: String-Operationen orientieren sich nicht mehr an den UTF-8-Byte-Sequenzen sondern denken 1 Byte = 1 Zeichen.
Hm... ich glaub nicht dass das wirklich die ideale lösung wäre... der rest funktioniert ja ofensichtlich wunderbar...
Kann ich vllt. MySQL sagen dass es diese Zeichen einfach ignoriert? Oder sie in der Java Anwendung irgendwie "unschädlich" machen?
Jedenfalls nochmal danke für deine Antwort!
echo $begrüßung;
Das sind gotische Zeichen, die in Unicode jenseits der Basic Multilingual Plane liegen, also Werte oberhalb von 0xFFFF haben.
Endlich mal jemmand der sich auskennt...
Ich hab nur an den richtigen Stellen recherchiert ... und etwas Erfahrung hinzugezogen.
Bin gestern im IRC alle möglichen Channels von #java über #mysql zu #wikipedia und #wikimedia-tech rauf und runter gelaufen, keiner wusste so recht was los ist...
Als erstes googelte ich nach der Meldung "Incorrect string value". Die Anworten deuteten darauf hin, dass diese Meldung kommt, wenn ungültige Werte für die verwendete Kodierung verwendet werden. Dass der Firefox sie mit einem 6-Ziffern-Ersatzzeichen anzeigte, statt der sonst zu sehenden 4-Ziffern-Zeichen anderer "exotischer" Zeichensysteme war ein Indiz auf "unnormale" Unicode-Zeichen. Etwas Nachlesen im MySQL-Handbuch ergab, dass MySQL dafür nicht ausgelegt ist.
Als Wissensergänzung kam noch hinzu: got -> Gotische Sprache -> Gotisches Alphabet.
Kann ich vllt. MySQL sagen dass es diese Zeichen einfach ignoriert?
Das macht es ja. Leider auch alle nachfolgenden Zeichen.
Oder sie in der Java Anwendung irgendwie "unschädlich" machen?
Wenn du sie als Zeichen außerhalb der BMP erkennen kannst (Ordinalwert größer 65535), dürfte es kein Problem sein, sie durch nichts oder ein anderes Ersatzzeichen auszutauschen.
echo "$verabschiedung $name";