[Vienna-pm] Seltsames XML::Parser-Problem

Peter J. Holzer hjp-vienna-pm-list at hjp.at
Sat Mar 5 12:41:51 PST 2005


> So ist es auch auf einem meiner Rechner. Auf anderen wird offenbar
> doppelt in UTF-8 umgewandelt: Aus dem ä werden die vier Bytes 0xC3 0x83
> 0xC2 0xA4. Soweit ich sehe passiert das einmal beim Parsen und beim
> Ausgeben noch einmal, weil der String beim Parsen nicht korrekt als
> UTF-8 markiert wird. 

Es geht offenbar mit Perl 5.8.3, aber nicht mit neueren Perls. 

Beim Testen bin ich aber auf etwas gestoßen, was nur am Rande mit dem
Problem zu tun hat, aber mich noch mehr verwirrt. Meiner Meinung nach
sollten zwei Strings dann und nur dann gleich sein (d.h., eq sollte true
liefern), wenn unpack("U*", $str) ein Array mit den gleichen
Zahlenwerten liefert.  Wenn ich selber irgendwelche Teststrings
zusammenbastle, ist das auch der Fall. Z.B.:

----------<testutf2>--------------------------------------------------
#!/usr/local/bin/perl
use warnings;
use strict;
use Encode;

sub toHex
{
    my $str = shift;
    my @a = unpack ("U*", $str);
    my $s = "";
    for (@a)
    {
        $s .= sprintf ("%02x ", $_);
    }
    $s .= utf8::is_utf8($str) ? "(utf8)" : "(bytes)";
    $s;
}

my $str1 = "\x{4c}\x{c3}\x{a4}\x{75}\x{66}\x{74}\x{20}\x{77}\x{6f}\x{3f}";
print toHex($str1), "\n";
my $str2 = Encode::decode("iso-8859-1", $str1);
Encode::_utf8_on($str1);
print "str1 = ", toHex($str1), "\n";
print "str2 = ", toHex($str2), "\n";
my $str3 = "L\x{e4}uft wo?";
print "str3 = ", toHex($str3), "\n";
print "str1 ", ($str1 eq $str2 ? "eq" : "ne"), " str2", "\n";
print "str1 ", ($str1 eq $str3 ? "eq" : "ne"), " str3", "\n";
print "str2 ", ($str2 eq $str3 ? "eq" : "ne"), " str3", "\n";
----------</testutf2>-------------------------------------------------

liefert:

4c c3 a4 75 66 74 20 77 6f 3f (bytes)
str1 = 4c e4 75 66 74 20 77 6f 3f (utf8)
str2 = 4c c3 a4 75 66 74 20 77 6f 3f (utf8)
str3 = 4c e4 75 66 74 20 77 6f 3f (bytes)
str1 ne str2
str1 eq str3
str2 ne str3

Von XML::DOM aber bekomme ich einen String 

t/dom_utf8.t: $str = 4c c3 a4 75 66 74 20 77 6f 3f (utf8)

zurück, der eq zum String

t/dom_utf8.t: $exp = 4c e4 75 66 74 20 77 6f 3f (bytes)

ist. Für mich sehen $str und $str2 bzw. $exp und $str3 identisch aus.
Trotzdem ist perl im einen Fall der Meinung, dass sie gleich seien, im
anderen Fall nicht. Versteht das wer?

	hp

-- 
   _  | Peter J. Holzer    | Weil wir die materielle Welt nicht so
|_|_) | Sysadmin WSR       | wahrnehmen, wie sie ist, sind Sachen wie
| |   | hjp at hjp.at         | JPEG, MP3 usw. möglich.
__/   | http://www.hjp.at/ |   -- Heiko Schlenker in drsm.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://mail.pm.org/pipermail/vienna-pm/attachments/20050305/47a28d36/attachment.bin


More information about the Vienna-pm mailing list