utf und latin
am 21.05.2006 09:37:55 von drm
Hallo Zusammen,
da ich in letzter Zeit schon so viel versucht habe und nie zum
korrekten Ergebnis gekommen bin, hier mein Problem:
1) Zuerst erhalte ich ein XML, dass ich via POST einlese:
read (STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
11) Der XML-Datenstrom wird in einer Datei gespeichert:
open(OUT,">>$dir/$remote_filename") or die
MyPackage::log_xml(Received::File::Error:". $!);
print OUT $query_string;
close(OUT);
12) Danach wird die variable an ein anderes Perl-Skript gesendet, dass
bestimmte Daten in einer DB (MS SQL) speichern soll:
use LWP::UserAgent;
use HTTP::Request;
my $dest_script=3D'xml_speichern.pl';
my $method=3D'POST';
my $uri=3D'http://10.10.0.9/cgi-bin/xml/' . $dest_script;
my $h=3DHTTP::Headers->new();
$h->content_type('text/xml');
$h->content_encoding('utf-8');
my $r=3DHTTP::Request->new($method, $uri, $h, $query_string);
my $ua=3DLWP::UserAgent->new;
my $res=3D$ua->request($r);
if ($res->is_success) { [...] }
2) Dieses Skript speichert die Daten in die DB.
Wenn ich mir den SQL-String ausgeben lasse, dann sind alle Zeichen
korrekt.
Selbst wenn ich das SQL-Statement in eine Textdatei schreibe (wie oben)
ist alles korrekt.
Nur in der DB sind die Umlaute/Sonderzeichen falsch:
zB.: lässt -> lässt
Habe schon versucht den SQL-String vorher in Latin zu konvertieren, hat
aber nichts gebracht.
Kann mir jemand weiterhelfen?
Danke & Grüße
mat
Re: utf und latin
am 21.05.2006 11:43:41 von Slaven Rezic
"drm" writes:
> Hallo Zusammen,
>
> da ich in letzter Zeit schon so viel versucht habe und nie zum
> korrekten Ergebnis gekommen bin, hier mein Problem:
>
> 1) Zuerst erhalte ich ein XML, dass ich via POST einlese:
>
> read (STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
>
>
> 1.1) Der XML-Datenstrom wird in einer Datei gespeichert:
>
> open(OUT,">>$dir/$remote_filename") or die
> MyPackage::log_xml(Received::File::Error:". $!);
> print OUT $query_string;
> close(OUT);
>
> 1.2) Danach wird die variable an ein anderes Perl-Skript gesendet, dass
> bestimmte Daten in einer DB (MS SQL) speichern soll:
>
> use LWP::UserAgent;
> use HTTP::Request;
>
> my $dest_script='xml_speichern.pl';
> my $method='POST';
> my $uri='http://10.10.0.9/cgi-bin/xml/' . $dest_script;
> my $h=HTTP::Headers->new();
> $h->content_type('text/xml');
> $h->content_encoding('utf-8');
>
> my $r=HTTP::Request->new($method, $uri, $h, $query_string);
> my $ua=LWP::UserAgent->new;
> my $res=$ua->request($r);
>
> if ($res->is_success) { [...] }
>
>
> 2) Dieses Skript speichert die Daten in die DB.
>
> Wenn ich mir den SQL-String ausgeben lasse, dann sind alle Zeichen
> korrekt.
> Selbst wenn ich das SQL-Statement in eine Textdatei schreibe (wie oben)
> ist alles korrekt.
>
> Nur in der DB sind die Umlaute/Sonderzeichen falsch:
> z.B.: lässt -> lässt
>
>
> Habe schon versucht den SQL-String vorher in Latin zu konvertieren, hat
> aber nichts gebracht.
Wie hast du das versucht?
>
> Kann mir jemand weiterhelfen?
>
Die richtige Vorgehensweise ist, die Daten vor dem Abspeichern in die
Datenbank in ein "rohes" Format zu bringen (die Terminologie spricht
dabei von "Octets" oder "Bytes", siehe perldoc Encode) und beim
Einlesen aus der Datenbank in das Perl-interne Format zu wandeln
(welches zufälligerweise UTF-8 ist, aber das muss man nicht wissen).
Also:
Perl -> DB: Encode::encode($encoding, $daten_aus_perl_variablen);
DB -> Perl: Encode::decode($encoding, $daten_aus_der_db);
Dabei ist das $encoding prinzipiell egal, solange es das gleiche ist.
utf-8 bietet sich an, weil man damit den kompletten
Unicode-Zeichensatz abdeckt. Mit anderen Encodings wie latin1 kann es
zu Informationsverlusten kommen. Allerdings muss man ggfs. der
Datenbank beibringen, dass die Daten als utf-8 vorliegen, wenn man
einige DB-Operationen wie "ORDER BY" benötigt.
Gruß,
Slaven
--
Slaven Rezic - slaven rezic de
tktimex - time recording tool
http://sourceforge.net/projects/ptktools/