Schrift
[thread]9922[/thread]

UTF-8 mit Perl und MySQL klappt nicht



<< >> 8 Einträge, 1 Seite
Lightman
 2007-08-01 20:15
#97160 #97160
User since
2007-01-31
57 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich möchte gerne UTF-8 Unicode nutzen. Ein Perl-Script holt sich Daten aus einer MySQL-Datenbank und gibt sie als XHTML aus.

- Kollation der Datenbank ist utf8_unicode_ci
- Header ist "content-type: text/html; charset=utf-8\n\n"
- Content-type der XHTML-Datei ist "application/xhtml+xml; charset=utf-8"

Ein print "ÄÖÜ\n" gibt auch ÄÖÜ aus, wogegen die Daten aus der Datenbank nur Fragezeichen sind.

Weiß jemand, wo der Fehler liegen könnte?
ptk
 2007-08-01 22:15
#97170 #97170
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Sind die Daten in der Datenbank auch tatsächlich utf8 (die Angabe der Kollation ist eigentlich egal)?
Machst du auch ein encode/decode bei deinen Datenbankoperationen UND verwendest du binmode(':utf8') beim Schreiben der XHTML-Datei?
Lightman
 2007-08-01 22:19
#97172 #97172
User since
2007-01-31
57 Artikel
BenutzerIn
[default_avatar]
Ja, die Daten in der DB sind UTF-8. Bei der Abfrage nutze ich kein Encode/Decode. XHTML wird nur ausgegeben, nicht gespeichert, daher auch kein binmode.

Ist Encode/Decode denn unbedingt nötig?

Edit: Scheinbar ist nicht use utf8; sondern use encoding qw(utf8); die Lösung. So wie ich das verstanden habe, ist utf8 nur für die Codierung des Scripts selbst und encoding für die Ausgabe. Es funktioniert jedenfalls.
Gast Gast
 2007-08-02 00:08
#97185 #97185
Also, wenn deine Datenbank utf8 Speicherst. DBD::mysql selber holt die Daten nur via ISO-8859-1 ab. Daher hast du einen String, und Perl selber denkt es wäre iso-8859-1 codiert, du musst Perl sagen das der Inhalt utf8 dekodiert ist. Daher jede variable die Daten aus der Datenbank enthält musst du folgendermaßen einmal bearbeiten.
Code: (dl )
utf8::decode($variable)
Damit wird das utf-8 flag für diese Variable gesetzt und Perl kann den Inhalt in die richtigen Unicode Zeichen intern umwandeln.

Wenn du "use utf8" am anfang schreibst, dann sagst du perl das die Datei (Skript) selber in utf8 Codiert ist. Ansonsten geht Perl wieder davon aus das das Skript selber "iso-8859-1" Codiert ist. Dass kann ebenfalls etliche Probleme hervorrufen. Wenn du dein Skript also in utf8 Abspeicherst solltest du auch "use utf8;" nutzen.

Weiterhin wenn du auch utf8 ausgeben willst dann musst du das Perl ebenfalls sagen. Sonst wandelt er jeden String um und gibt ihn iso-8859-1 Codiert aus.

Das kannst du mit binmode machen.
Code: (dl )
binmode HANDLE, ':utf8'

Damit setzt du einen einzelnen Handle direkt auf utf8.

Das was du gemacht hast.
Code: (dl )
use encoding ':utf8'

Setzt utf8 für STDIN, STDOUT und STDERR.

Besser wäre aber du machst gleich folgendes:
Code: (dl )
use open ':utf8';


Damit sind dann alle deine Handles automatisch utf8.


NOchmal kurz überblick.
1) "use utf8" => wenn das Skript selber utf8 Kodiert ist
2) "binmode HANDLE ':utf8'" => Setzt einen einzelnen Handle auf UTF8
3) "use encoding ':utf8'" => Setzt die Default Handles auf utf8
4) "use open ':utf8'" => Alle Handles auf utf8 setzen
5) "utf8::decode($variable)" => Einen Einzelnen String flagen damit Perl weiß das dort utf8 gespeichert ist.
Gast Gast
 2007-08-02 00:09
#97186 #97186
Schritt 5) musst du leider machen weil die Entwickler von DBD::mysql dies noch nicht selber eingebaut haben. Je nachdem welche Optionen du hier und da geschickt setzt, kannst du auch um das utf8::decode herumkommen, und die ausgabe sieht nachher "Korrekt" aus. Allerdiengs kannst du dann an irgendeiner anderen Stelle Probleme bekommen.

P.S.:
Wer hat sich den den Schwachsinn einfallen lassen das nur maximal 2.000 Zeichen erlaubt sind? -.-

Davon bin ich gar kein Freund! Bitte deutlich Höher setzen!!!
sid burn
 2007-08-02 00:10
#97187 #97187
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Ähh, war nicht eingeloggt, die oberen zwei Posts, das war ich.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
ptk
 2007-08-02 02:05
#97191 #97191
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Lightman+2007-08-01 20:19:35--
XHTML wird nur ausgegeben, nicht gespeichert, daher auch kein binmode.
Gerade bei der *Ausgabe* brauchst du binmode(utf8).
Lightman
 2007-08-03 22:31
#97454 #97454
User since
2007-01-31
57 Artikel
BenutzerIn
[default_avatar]
Danke für eure Antworten. Mit binmode hast du natürlich recht, ptk.
<< >> 8 Einträge, 1 Seite



View all threads created 2007-08-01 20:15.