Christian: perl, mysql und utf8

Beitrag lesen

Hallo,

ich habe in meiner Anwendung irgendwo ein Problem mit dem Zeichensatz, aber ich finde es nicht.

Der Reihe nach:

1. Mein Perl-Skript ist in ISO-8859-1 geschrieben, ich verwende "use utf8;" also _nicht_.

2. Ich hole mit LWP eine Webseite, die UTF8-codiert ist. Deshalb mache ich

  
$content = $response->decoded_content;  

Netterweise sind alle Umlaute u. dgl. als Entities, so dass

  
$text = HTML::Entities::decode_entities($content)  

eigentlich schon reichen würde (?).

3. Zum Testen habe ich

  
print "$text\n";  

und das sieht im ISO-Terminal korrekt aus (Hier konvertiert Perl also die Ausgabe?).

4. Ich baue den SQL-Query auf und printe ihn zum Testen:

  
$sql = "UPDATE table SET text = ", $dbh->quote($text), " WHERE ...;";  
print "$sql\n";  

Im gleichen ISO-Terminal sind die Umlaute nun kaputt, so wie es sich für einen utf8-Query gehört.

5. Der Query wird abgeschickt. Die MySQL-Variablen:

  
character_set_client = utf8  
character_set_connection = utf8  
character_set_database = utf8  
character_set_results = utf8  

Die Database, die Table und jede Spalte sind _alle_ auf utf8 gestellt.

Der Text sollte nun ordnungsgemäß in der DB gelandet sein.

Ist er aber nicht.

  • Wenn ich die neue Zeile in phpmyadmin anschaue, dann steht dort "ü" statt "ü" und der Firefox sagt mir, dass er UTF-8 anzeigt.
  • In meiner ISO-Konsole erscheint statt dem "ü" noch mehr: "ü", wobei hier aber ein nicht anzeigbares Zeichen sein muss, denn "select HEX(text) ..." bringt "C383C2BC" statt dem "ü".

Es muss also irgendwo einen Punkt geben, wo der korrekte utf8-String als ISO interpretiert wird und nochmals in utf8 gewandelt wird. Nur so kann ich mir das erklären. Wo diese Umwandlung aber stattfinden soll, weiß ich nicht.

Ich hoffe ihr könnt mir helfen. Danke schonmal für Lesen des etwas längeren Textes!

Grüße
Christian