Christian: perl, mysql und utf8

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

  1. Benutzt du einen XML-Parser, mit dem du die Website verarbeitest? Damit hatte ich schon mal ein ähnliches Problem...

    1. Benutzt du einen XML-Parser, mit dem du die Website verarbeitest?

      Nein, denn erstens wird kein XML geliefert und zweitens ist die Seite häufig nicht mal HTML-konform.
      Die Sachen, die ich haben will, kann ich aber trotzdem zuverlässig aus der Seite rauslesen, eben aus dem decoded_content().

      1. Vielleicht hat die Funktion "decoded_content" ebenfalls dieses "Feature"... versuch es mal ohne diese Funktion. Möglicherweise klappt das...

  2. hi,

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

    _Warum_ nicht?

    1. Ich hole mit LWP eine Webseite, die UTF8-codiert ist.
    2. 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.  
      
    Alles UTF-8 - nur die Datenbehandlung/Ausgabe in deinem Script nicht - wieso tust du dir solche Probleme an, anstatt \_konsequent\_ UTF-8 zu verwenden?  
      
    
    > - 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 "ü".  
      
    Das dürfte wohl ü nochmal in UTF-8 kodiert sein, also ü.  
      
    gruß,  
    wahsaga  
      
    
    -- 
    /voodoo.css:  
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    
      1. Mein Perl-Skript ist in ISO-8859-1 geschrieben, ich verwende "use utf8;" also _nicht_.

      _Warum_ nicht?

      Hmm, jetzt wo du so fragst... Solange ich nur ASCII in meinem Code verwende ist er ja utf8-kompatibel und dann dürfte "use utf8;" keine Probleme machen. Stimmts?

      Alles UTF-8 - nur die Datenbehandlung/Ausgabe in deinem Script nicht - wieso tust du dir solche Probleme an, anstatt _konsequent_ UTF-8 zu verwenden?

      Ich hatte bisher noch nie Probleme mit ISO.
      Meinst du mit konsequent "use utf8;" oder noch mehr? Wenn ich dann UTF-8 Ausgabe in meiner ISO-Konsole habe, gibt das ein Durcheinander und wenn ich die Konsole dann auf UTF-8 stelle, habe ich an anderer Stelle ein Durcheinander.

      Das dürfte wohl ü nochmal in UTF-8 kodiert sein, also ü.

      Genau, das hatte ich in meinem ersten Post auch schon stehen. Da wollte ich wissen, woher das kommt.

      Nun habe ich allerdings deinen ersten Rat mal befolgt und "use utf8;" benutzt. Erstaunlicherweise kommen die Daten nun richtig in der DB an. (Erstaunlicherweise, weil in der perldoc stehe "Do not use this pragma for anything else than telling Perl that your script is written in UTF-8.")
      Aber gut. In der Konsole tut auch alles richtig, aber der phpmyadmin hat immer noch ein Problem. Firefox sagt zwar UTF-8, aber es sieht so aus, als würde er ISO darstellen. Aber das ist das kleinere Problem.

      Grüße
      Christian

  3. Hey,
    mir sind Schritt 2 und 3 unklar.

    Bist du sicher, dass das Dokument in UTF-8 vorliegt? Bist du sicher, dass der Webserver es entsprechend markiert ausliefert? Lasse dir mit Data::Dump::Streamer das LWP::UserAgent-Objekt ausgeben, oder notfalls veröffentliche ein Beispiel im Web, anhand dessen wir experimentieren können.

    Sind alle nicht-ASCII-Zeichen entitykodiert? Warum, wenn's doch um UTF-8 geht, wo das nicht nötig ist?

    Was für ein Terminal ist das? Hast du Encode::encode() zur Ausgabe benutzt?

    --
    水-金-地-火-木-土-天-海-冥