unicode (was Re: [Vienna-pm] Hash-Frage von extern)

Peter J. Holzer hjp at wsr.ac.at
Wed Sep 29 13:14:17 CDT 2004


On 2004-09-28 20:32:27 +0200, Karlheinz Zoechling wrote:
> On Tue, 28 Sep 2004 14:09:37 +0200, peter pilsl wrote:
> >Egal wie ich es mache, irgendetwas funktioniert nicht:
> [..]
> >verwende ich utf8::decode, dann spielt das lc() nicht mit bzw. macht 
> >CGI.pm bei den sticky-outputs Problemen.
> 
> verwende nicht utf8::decode und encode. wirklich zielfuehrend zum hin-und-
> her codieren ist nur
> 
> use Encode;
> 
> und 
> 
> Encode::from_to();

Einspruch! Das codiert nämlich zwischen zwei Encodings, d.h., Du hast
als Ergebnis wieder einen String von Bytes und nicht einen String von
Characters. lc kann dann z.B. nicht funktionieren.
Besser ist es, Encode::decode und Encode::encode zu verwenden
(utf8::decode und utf8::encode müssten aber äquivalent sein, wenn nur
von/nach UTF-8 umgewandelt werden soll).


D.h., 

use Encode;

$bytestring = get_string_in_charset_X();
$charstring = decode("X", $bytestring);

$charstring2 = do_lots_of_stuff($charstring);

$bytestring2 = encode("Y", $charstring);
put_string_in_charsetY($bytestring2);

do_lots_of_stuff arbeitet dann einfach mit Characterstrings, und ob die
Zeichen jetzt lateinische Buchstaben, Umlaute oder chinesische Zeichen
sind, ist ihm völlig egal. 


Z.B. hier ein Ausschnitt aus einem Programm zum Kategorisieren von Mails:

        if ($entity->mime_type eq "text/plain") {
            my $cs = $entity->head->mime_attr("content-type.charset") ;
            $cs = "us-ascii" unless ($cs && Encode::resolve_alias($cs));
            my $bh = $entity->bodyhandle();
            my $io = $bh->open("r");
            while (defined (my $l = $io->getline())) {
                $l = decode($cs, $l);
                my @t = ($l =~ m/(\w+)/g);
                for my $t (@t) {
                    $self->add_token($t);
                }
            }
            $io->close();
        } else {

(da $io ein Filehandle ist, müsste eigentlich auch 
binmode($io, "encoding($cs)")
statt des expliziten decode-Aufrufs funktionieren)


	hp

-- 
   _  | Peter J. Holzer      | Shooting the users in the foot is bad. 
|_|_) | Sysadmin WSR / LUGA  | Giving them a gun isn't.
| |   | hjp at wsr.ac.at        |	-- Gordon Schumacher,
__/   | http://www.hjp.at/   |     mozilla bug #84128
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 388 bytes
Desc: not available
Url : http://mail.pm.org/archives/vienna-pm/attachments/20040929/8d7c5ee4/attachment.bin


More information about the Vienna-pm mailing list