[LUGA] Mit freundlicher Unterstützung von:
Linux New Media AG

Mail Thread Index


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [luga] Perl UTF8 und LDIF (lang und eigentlich OT)



On 2007-02-28 22:01:46 +0100, Goesta Smekal wrote:
> 'perldoc perluniintro' behauptet:
> 
> >How Do I Know Whether My String Is In Unicode?
> >
> >  You shouldn't care.  No, you really shouldn't.  No, really.  If you
> >  have to care--beyond the cases described above--it means that we
> >  didn't get the transparency of Unicode quite right.

Yep. Das ist der springende Punkt. Du solltest nicht wissen, dass die
"internal string representation" irgendwas mit Unicode zu tun hat, und
schon gar nicht, dass es es UTF-8 ist. Das ist es nämlich nicht
immer, und ob es das ist oder nicht, soll keinen Unterschied machen. Der
String "\xFF" soll sich immer gleich verhalten, egal ob er jetzt intern
als ein oder zwei Bytes repräsentiert ist.

(in der Praxis ist das leider nicht immer so)


> So weit, so gut. Also schreibe ich in mein Script:
> 
> >    if (  $field =~ /[^a-z,A-Z\d\s\/\.,-_]/) {
> >      my $out = encode("utf8",$field);

Hier wandelst Du explizit von der "internal string representation" nach
utf8 um.

> >      print "$fieldnames[$c]:: ".MIME::Base64::encode($out);
> >    }
> >    else { 
> >      print "$fieldnames[$c]: $field\n";
> >    }

[...]

> [begin "iso2utf8_base64.pl"]
> #!/usr/bin/perl -w
> use strict;
> use encoding 'utf8';
> use MIME::Base64;
> use Encode 'decode';
> binmode(STDOUT, ":utf8");
> while (<>) {
>   $_=decode("iso-8859-1", $_);

Hier tust Du das aber nicht. Du wandelst den Input von iso-8859-1 in die
"internal string representation" um, und die 

>   print MIME::Base64::encode($_);

wirfst Du dann MIME::Base64::encode vor. Und das sollte aus dem String
"\x{FF}\x{FF}\x{FF}" einfach immer "////" machen, weil den Programmierer
einfach nicht interessieren sollte, wie "\x{FF}\x{FF}\x{FF}" intern
repräsentiert ist.

Wenn Du utf-8 willst, musst Du explizit encode aufrufen, so wie Du es
oben gemacht hast.

while (<>) {
    $_=decode("iso-8859-1", $_);
    $_=encode("utf-8", $_);
    print MIME::Base64::encode($_);
}

Das decode kannst Du dabei einem IO-Filter überlassen:

binmode STDIN, ":encoding(iso-8859-1)";
while (<>) {
    $_=encode("utf-8", $_);
    print MIME::Base64::encode($_);
}

und die Zuweisung an $_ kann man sich natürlich auch noch sparen:

binmode STDIN, ":encoding(iso-8859-1)";
while (<>) {
    print MIME::Base64::encode(encode("utf-8", $_));
}


	hp

-- 
   _  | Peter J. Holzer    | Ich sehe nun ein, dass Computer wenig
|_|_) | Sysadmin WSR       | geeignet sind, um sich was zu merken.
| |   | hjp@hjp.at         |
__/   | http://www.hjp.at/ |	-- Holger Lembke in dan-am

Attachment: signature.asc
Description: Digital signature



powered by LINUX the choice of a gnu generation
linux user group austria;
Suche
Suche
Letzte Änderung:
webmaster@luga.at
September 2010