Durcheinander mit Zeichencodierung

Hallo,

bei mir herrschen offenbar einige Unklarheiten im Umgang mit Perl und den verschiedenen Zeichencodierungen.

Und zwar folgendes: Ich möchte von einem Klienten auf den Server zugreifen. Dazu habe ich eine .NET-Anwendung (Windows-Forms, 2003, ist aber nicht so wichtig), welche einen String mittels System.Text.UTF8Encoding in eine Bytefolge umwandelt. Diese Bytefolge wird an einen Request gepostet und dieser an den Server geschickt. Soweit so gut.

Das Perl-Skript empfängt diese Bytefolge mittels:

read(STDIN, $In, $ENV{'CONTENT\_LENGTH'}) || die "Could not process posted information";

$In wird gesplittet und die Teilstrings in eine mySQL-Datenbank geschrieben. Bei den Feldern der Datenbank ist „Kollation“ auf „utf8_general_ci“ gesetzt.

Das Problem: Aus dem ursprünglichen string „René“ wird „René“ und mit anderen Sonderzeichen passiert ähnliches.

Der String scheint allerdings in Perl richtig anzukommen, denn schreibe ich ihn in mit STDOUT in eine Text-Datei, dann stimmt er. Oder ist die Kodierung der Datenbank falsch?

Danke im Voraus für jeden Hinweis!
Alex

Hallo

Und zwar folgendes: Ich möchte von einem Klienten auf den
Server zugreifen. Dazu habe ich eine .NET-Anwendung
(Windows-Forms, 2003, ist aber nicht so wichtig), welche einen
String mittels System.Text.UTF8Encoding in eine Bytefolge
umwandelt. Diese Bytefolge wird an einen Request gepostet und
dieser an den Server geschickt. Soweit so gut.

Das Problem: Aus dem ursprünglichen string „René“ wird „René“
und mit anderen Sonderzeichen passiert ähnliches.

Der String scheint allerdings in Perl richtig anzukommen, denn
schreibe ich ihn in mit STDOUT in eine Text-Datei, dann stimmt
er. Oder ist die Kodierung der Datenbank falsch?

Ren{'e}:

 UTF8 =\> 52 65 6E C3 A9 / René
 LATIN1 =\> 52 65 6E E9 / René

Wenn der UTF8-String als Latin-1 (iso-8859-1)
angezeigt wird, sieht man entsprechend „zwei Zeichen“

Das würde bedeuten, dass UTF-8 in der db ist,
dieses aber am Ende als Latin-1 angezeigt wird.

Grüße

CMБ

Hallo,

Der String scheint allerdings in Perl richtig anzukommen, denn
schreibe ich ihn in mit STDOUT in eine Text-Datei, dann stimmt
er. Oder ist die Kodierung der Datenbank falsch?

Ren{'e}:

UTF8 => 52 65 6E C3 A9 / René
LATIN1 => 52 65 6E E9 / René

Wenn der UTF8-String
als Latin-1 (iso-8859-1)
angezeigt wird, sieht man entsprechend „zwei Zeichen“

Das würde bedeuten, dass UTF-8 in der db ist,
dieses aber am Ende als Latin-1 angezeigt wird.

Ein Weg, um das zu testen, ist ein CGI-Script zu schreiben, dass den String aus der Datenbank ausliest und mit

print „Content-Type: text/html; charset=utf-8\n\n“;
print
Charset-Test $deinString
HTML

auszugeben. Bei text/plain würde ich mich nicht darauf verlassen, dass der Browser die richtige Codierung wählt, obwohl es eigentlich[tm] klappen sollte.

Grüße,
Moritz

Hallo,

vielen Dank für die Hilfe, ich habe jetzt eine Lösung gefunden! Es war tatsächlich so, dass die ganze Zeit schon alles bestens in UTF8 codiert wurde. Das Problem war ein anderes, das ich gar nicht vermutet hätte. Und zwar missglückte immer ein Vergleich von jeweils zwei Strings, wobei der eine von einem Web-Formular kam (ist Latin1, ich dachte das wäre UTF8) und der andere wie gesagt von meinem .NET-Programm. So suchte ich das Problem an der falschen Stelle!

Ich habe das nun so gelöst, dass ich im .NET-Programm nicht mehr in UTF8, sondern ebenfalls in Latin codiert habe. Nun enthält die Datenbank ausschließlich Latin-Strings (und wird in meiner Web-Schnittstelle für die Datenbank auch entsprechend dargestellt) und alle Vergleiche funktionieren wieder!

Viele Grüße
Alex