Koi8-r daten auslesen
Michael
- php
0 Sven Rautenberg0 Michael
1 dedlfix
Hallo, vielleicht kann einer von Euch mir helfen,
Ich habe eine mehrsprachige Seite, in der sowohl Deutsch als auch russisch als Sprache gewählt werden kann. Ich habe in der MYSQL-Datenbank zwei Spalten, die eine ist normal utf-8 und die andere ist in koi8-r. Die Inhalte werden in der Datenbank richtig angezeigt, beim Auslesen im PHP kommen aber bei der russischen Spalte nur Fragezeichen, also verwendet er den falschen Zeichensatz! Meine Frage wäre nun, wie kann ich dem SELECT-Befehl sagen, dass er die Daten im koi8-r Format auslesen muss?!
Kann mir bitte jemand helfen, ich drehe bald durch!
Danke + Gruß
Michael
Moin!
Ich habe eine mehrsprachige Seite, in der sowohl Deutsch als auch russisch als Sprache gewählt werden kann. Ich habe in der MYSQL-Datenbank zwei Spalten, die eine ist normal utf-8 und die andere ist in koi8-r.
Falscher Ansatz! Codiere sämtliche Zeichen in UTF-8. Jeder Browser der Welt kann damit umgehen, auch russische.
- Sven Rautenberg
Moin!
Ich habe eine mehrsprachige Seite, in der sowohl Deutsch als auch russisch als Sprache gewählt werden kann. Ich habe in der MYSQL-Datenbank zwei Spalten, die eine ist normal utf-8 und die andere ist in koi8-r.
Falscher Ansatz! Codiere sämtliche Zeichen in UTF-8. Jeder Browser der Welt kann damit umgehen, auch russische.
- Sven Rautenberg
Ja natürlich, aber utf-8 kann nicht mit den russischen Zeichen umgehen! Also die Seite ist in deutscher, wie in russischer Sprache, das heißt, dass dort auch russische Zeichen (kyrillische) angezeigt werden. Der Rest, wie auch die Seite sind ja utf-8, genauso wie die MYSQL-Datenbank. Ich bekomme die Daten aber aus der Datenbank schon als Fragezeichen, diese werden aber dort richtig angezeigt!
-Michael
Moin!
Ja natürlich, aber utf-8 kann nicht mit den russischen Zeichen umgehen!
UTF-8 kann mit allen Zeichen der Welt umgehen, auch mit russischen, glaub mir.
Also die Seite ist in deutscher, wie in russischer Sprache, das heißt, dass dort auch russische Zeichen (kyrillische) angezeigt werden. Der Rest, wie auch die Seite sind ja utf-8, genauso wie die MYSQL-Datenbank. Ich bekomme die Daten aber aus der Datenbank schon als Fragezeichen, diese werden aber dort richtig angezeigt!
UTF-8 und KOI8-r können halt nicht gleichzeitig auf einer einzigen HTML-Seite benutzt werden. Und es ist viel zu fehleranfällig, auf einer Website ZWEI Codierungen zu benutzen. Insbesondere, wenn die eine benutzte Codierung die Zeichen der anderen Codierung mit enthält.
Sorge dafür, dass die russischen Texte als UTF-8 in die Datenbank kommen.
- Sven Rautenberg
Moin!
Ja natürlich, aber utf-8 kann nicht mit den russischen Zeichen umgehen!
UTF-8 kann mit allen Zeichen der Welt umgehen, auch mit russischen, glaub mir.
Also die Seite ist in deutscher, wie in russischer Sprache, das heißt, dass dort auch russische Zeichen (kyrillische) angezeigt werden. Der Rest, wie auch die Seite sind ja utf-8, genauso wie die MYSQL-Datenbank. Ich bekomme die Daten aber aus der Datenbank schon als Fragezeichen, diese werden aber dort richtig angezeigt!
UTF-8 und KOI8-r können halt nicht gleichzeitig auf einer einzigen HTML-Seite benutzt werden. Und es ist viel zu fehleranfällig, auf einer Website ZWEI Codierungen zu benutzen. Insbesondere, wenn die eine benutzte Codierung die Zeichen der anderen Codierung mit enthält.
Sorge dafür, dass die russischen Texte als UTF-8 in die Datenbank kommen.
- Sven Rautenberg
So nun sind die Russischen Texte als UTF-8 in der Datenbank, werden aber trotzdem nicht auf der Seite dargestellt, obwohl die Seite eine META-TAG charset=utf-8 hat ?!
Moin!
Sorge dafür, dass die russischen Texte als UTF-8 in die Datenbank kommen.
- Sven Rautenberg
So nun sind die Russischen Texte als UTF-8 in der Datenbank, werden aber trotzdem nicht auf der Seite dargestellt, obwohl die Seite eine META-TAG charset=utf-8 hat ?!
Ja klar, seh' ich.
Oder vielleicht irritiert mich auch nur die Spiegelung in meiner Glaskugel...
- Sven Rautenberg
Hallo Michael
So nun sind die Russischen Texte als UTF-8 in der Datenbank, werden aber trotzdem nicht auf der Seite dargestellt, obwohl die Seite eine META-TAG charset=utf-8 hat ?!
Das ist doch uninteressant. Schau dir mittels LiveHTTPHeaders für den Firefox an welche Codierung im Header steht und ändere das eventuell. Probiere im Browser die Zeichenkodierung manuell zu ändern, z.B. in latin1, utf-8, koi-irgendwas. Wenn z.B. in koi die russischen Zeichen richtig dargestellt werden, hast du sie nicht richtig in utf-8 konvertiert. Wenn in latin1 Umlaute oder sonstige Zeichen, die normalerweise in utf-8 zwei bytes benötigen auf einmal vier Zeichen sind, wird einmal zuviel nach Unicode konvertiert.
Grüße
Jasmin
echo $begrüßung;
Die Inhalte werden in der Datenbank richtig angezeigt,
Diese Aussage ist zu allgemein. In der Datenbank werden Inhalte wie in einer Balck-Box abgelegt. Du siehst als Außenstehender nicht, wie das geschieht. Um dir den Inhalt anzusehen muss er abgefragt werden, und dabei gibt es etwas zu beachten (siehe unten). Womit hast du dir also die Inhalte ausgeben lassen? Wenn es der phpMyAdmin in einer halbwegs aktuellen Version war, dann wäre deine Aussage wenigstens richtig, denn der hat seine Hausaufgaben bezüglich des unten Stehenden gemacht.
beim Auslesen im PHP kommen aber bei der russischen Spalte nur Fragezeichen, also verwendet er den falschen Zeichensatz!
Wer ist in dem Fall er? Der Server, der Client oder gar der Browser? Vermutlich hab ihr euch nur nicht auf eine geeignete Kodierung geeinigt.
Meine Frage wäre nun, wie kann ich dem SELECT-Befehl sagen, dass er die Daten im koi8-r Format auslesen muss?!
In welcher Kodierung du das Abfrageergebnis erhältst wird im Konfigurationswert character_set_results festgelegt. Welche Kodierung die Felder haben, ist dabei nicht entscheidend, denn MySQL nimmt beim Ausliefern gegebenenfalls Umkodierungen vor. Natürlich muss die Zielkodierung alle verwendeten Zeichen darstellen können, sonst gibt es Datenverlust. Weitere Voraussetzung ist, dass die Daten in den Feldern auch der Kodierung entspricht, die für die Felder angegeben wurde. Dies kann man sicherstellen, indem man die Daten in der Kodierung an das MySQL-System gesendet hat, die in character_set_client und character_set_connection angegeben wurden. Wenn für die Felder eine andere Kodierung angegeben wurde, nimmt MySQL hier auch wieder Umkodierungen vor. In Richtung MySQL sind auch noch character set introducer interessant, auf die ich aber nicht weiter eingehen werden. Wenn man durchgehend UTF-8 nimmt kann man sich diese nämlich sparen.
Alle drei genannten character_set_*-Werte werden in einem Rutsch mit der Anweisung SET NAMES ... für die aktuelle Verbindung eingestellt. Siehe dazu das Kapitel Connection Character Sets and Collations und meinen Versuchsaufbau von gestern, bei dem es aber um ein etwas anderes Problem ging. Die Lektüre der anderen Teile des Kapitels Character Set Support kann auch nicht schaden.
echo "$verabschiedung $name";
echo $begrüßung;
Die Inhalte werden in der Datenbank richtig angezeigt,
Diese Aussage ist zu allgemein. In der Datenbank werden Inhalte wie in einer Balck-Box abgelegt. Du siehst als Außenstehender nicht, wie das geschieht. Um dir den Inhalt anzusehen muss er abgefragt werden, und dabei gibt es etwas zu beachten (siehe unten). Womit hast du dir also die Inhalte ausgeben lassen? Wenn es der phpMyAdmin in einer halbwegs aktuellen Version war, dann wäre deine Aussage wenigstens richtig, denn der hat seine Hausaufgaben bezüglich des unten Stehenden gemacht.
Also ich benutze phpMyAdmin 2.9.1.1-Debian-3. Die MYSQL-Datenbank läuft mit Zeichencode utf-8. Alle Spalten, die ich dort angelegt habe, laufen ebenfalls über utf-8. Die einzige Spalte die eine andere Zeichencodierung hat, ist die Spalte mit russischem Content. Dieser wird, wie nicht anders vermutet, natürlich im russischen Zeichenformat geschrieben. Dafür habe ich bemerkt, brauche ich den kio8-r Zeichensatz, sonst kommt in PhpMyAdmin nur noch Fragezeichen an. Diese Spalte habe ich umgestellt und damit wird es in PMA ordentlich angezeigt.
beim Auslesen im PHP kommen aber bei der russischen Spalte nur Fragezeichen, also verwendet er den falschen Zeichensatz!
Wer ist in dem Fall er? Der Server, der Client oder gar der Browser? Vermutlich hab ihr euch nur nicht auf eine geeignete Kodierung geeinigt.
Ich beziehe mich auf die Ausgabe der Zelle, die ich in PMA mit koi8-r Zeichensatz versehen habe. Lese ich also den Wert mit PHP über MYSQL_REQUEST aus, und zeige diesen auf der Seite an, stehen dort statt der richtigen Zeichen Fragezeichen.
Meine Frage wäre nun, wie kann ich dem SELECT-Befehl sagen, dass er die Daten im koi8-r Format auslesen muss?!
In welcher Kodierung du das Abfrageergebnis erhältst wird im Konfigurationswert character_set_results festgelegt. Welche Kodierung die Felder haben, ist dabei nicht entscheidend, denn MySQL nimmt beim Ausliefern gegebenenfalls Umkodierungen vor. Natürlich muss die Zielkodierung alle verwendeten Zeichen darstellen können, sonst gibt es Datenverlust. Weitere Voraussetzung ist, dass die Daten in den Feldern auch der Kodierung entspricht, die für die Felder angegeben wurde. Dies kann man sicherstellen, indem man die Daten in der Kodierung an das MySQL-System gesendet hat, die in character_set_client und character_set_connection angegeben wurden. Wenn für die Felder eine andere Kodierung angegeben wurde, nimmt MySQL hier auch wieder Umkodierungen vor. In Richtung MySQL sind auch noch character set introducer interessant, auf die ich aber nicht weiter eingehen werden. Wenn man durchgehend UTF-8 nimmt kann man sich diese nämlich sparen.
Alle drei genannten character_set_*-Werte werden in einem Rutsch mit der Anweisung SET NAMES ... für die aktuelle Verbindung eingestellt. Siehe dazu das Kapitel Connection Character Sets and Collations und meinen Versuchsaufbau von gestern, bei dem es aber um ein etwas anderes Problem ging. Die Lektüre der anderen Teile des Kapitels Character Set Support kann auch nicht schaden.
WOW, das klingt gut, könntest Du/Sie/... mir bitte einen Code-snipsel posten, wie ich das in den MYSQL_REQUEST übernehme. Das Problem ist, dass ich ja sowohl utf-8, wie auch koi8-r ausgeben möchte. Also für Deutsch(und was sonst noch für Sprachen sind) utf-8 und für Russisch dann das ganze in koi8-r.
echo "$verabschiedung $name";
danke §name = michael
echo $begrüßung;
Also ich benutze phpMyAdmin 2.9.1.1-Debian-3. Die MYSQL-Datenbank läuft mit Zeichencode utf-8.
Wenn du mit Datenbank in dem Fall den Server als ganzes meinst, dann ist diese Angabe für deine Daten weniger wichtig. Sie dient oft nur als Default-Wert, wenn in untergeordneten Elementen (Datenbanken, Tabellen, Felder, Client-Verbindungen) keine expliziten Festlegungen getroffen wurden.
Auch die Kodierungsangabe der Datenbank (hier: Container für die Tabellen) ist nur ein Default-Wert für neu angelegte Tabellen, und der Wert für eine Tabelle ist nur ein Default-Wert für neu angelegte Felder.
Alle Spalten, die ich dort angelegt habe, laufen ebenfalls über utf-8.
Hast du da auch Zeichen jenseits von reinem ASCII abgelegt, z.B. Umlaute als direkte Zeichen, nicht als HTML-Entities? Und sind diese in Ordnung?
Die einzige Spalte die eine andere Zeichencodierung hat, ist die Spalte mit russischem Content. Dieser wird, wie nicht anders vermutet, natürlich im russischen Zeichenformat geschrieben.
"Russisches Zeichenformat" ist kein besonders günstiger Ausdruck. Es gibt russische (oder vielleicht besser kyrillische) Zeichen, die sehen z.B. so aus: Ю Ж Л. Und es gibt Zahlenwerte, die diese Zeichen repräsentieren. Je nach Vorschrift sind das unterschiedliche. In KOI8-R ist das Ж als F6 kodiert und in Unicode als 0416, was in UTF-8 zu D0 96 wird.
Dafür habe ich bemerkt, brauche ich den kio8-r Zeichensatz, sonst kommt in PhpMyAdmin nur noch Fragezeichen an. Diese Spalte habe ich umgestellt und damit wird es in PMA ordentlich angezeigt.
Dann machst du irgendwas verkehrt. Wenn du mit dem MySQL-Server UTF-8 vereinbart hast und ihm UTF-8-kodierte Zeichen sendest, dann kommen keine Fragezeichen zustande (es sei denn, es handelt sich um ein richtig kodiertes solches).
Ich beziehe mich auf die Ausgabe der Zelle, die ich in PMA mit koi8-r Zeichensatz versehen habe. Lese ich also den Wert mit PHP über MYSQL_REQUEST aus, und zeige diesen auf der Seite an, stehen dort statt der richtigen Zeichen Fragezeichen.
Vielleicht solltest du dir mal die genauen Byte-Werte ausgeben lassen, die du bekommst. In ein lesbares Format bekommst du sie mit bin2hex() oder auch url_encode(). Diese Nachforschungen müssten aber nicht sein, wenn du nach dem Verbindungsaufbau "SET NAMES utf8" an den MySQL-Server sendest oder noch besser die mysqli-Funktionen oder -Klassen und mysqli_set_charset() verwendest. Dann sorgst du dafür, dass du UTF-8-Kodiertes an den Server sendest und der sorgt dafür, dass du UTF-8-Kodiertes erhältst. Und die Felder stellst du alle auf UTF-8 und alles wird gut :-)
WOW, das klingt gut, könntest Du/Sie/... mir bitte einen Code-snipsel posten, wie ich das in den MYSQL_REQUEST übernehme. Das Problem ist, dass ich ja sowohl utf-8, wie auch koi8-r ausgeben möchte. Also für Deutsch(und was sonst noch für Sprachen sind) utf-8 und für Russisch dann das ganze in koi8-r.
SET NAMES ... sendet man als eigenständige Anweisung über einen mysql_query()-Aufruf an den MySQL-Server. (Beispiele für mysqli_set_charset() gibt es im PHP-Handbuch.)
Ich hoffe, du hast nun verstanden, dass bei Verwendung von UTF-8 kein KOI8-R mehr notwendig ist, und dass der MySQL-Server sein Ergebnis immer nur in einer einzigen Kodierung zurückliefert / zurückliefern kann. Wenn du immer noch beide Kodierungen brauchst, dann musst du zwei Abfragen starten. Bei der einen muss die Client-Vervindungskodierung auf UTF-8 stehen, bei der anderen auf KOI8-R. Also zwischendurch SET NAMES ausführen.
echo "$verabschiedung $name";