PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : encoding problem in perl



bert2002
25-04-2010, 12:22
Hi,

ich habe ein kleines encoding problem mit dem XML::RSS Module. Ich versuche einen RSS feed mit Japanischen Zeichen zu erstellen. In dem Script kann ich die Japanischen Zeichen normal benutzen, aber sobald ich diese an XML:RSS uebergebe, dann kommt nur noch was komisches bei herraus:

beispiel script:

#!/usr/bin/perl

use utf8;
use XML::RSS;
use Encode qw/encode decode/;


my $name="メール";
my $title="どこでも";


print "$name ----- $title\n";

my $rss = XML::RSS->new(version=>'2.0');
$rss->channel(
title => "$name",
link => "http://link.com",
language => "ja",
description => "$name",
pubDate => 'Thu, 23 Aug 1999 07:00:00 GMT',
lastBuildDate => 'Thu, 23 Aug 1999 16:20:26 GMT',

);


my $check = utf8::valid($name);
print "is utf valild?: $check\n";

$rss->add_item(title => "$name",
link => "http://link.com",
mode => 'insert'
);


print $rss->as_string;
$rss->save("test.xml");


und das Ergebniss:

メール ----- どこでも
is utf valild?: 1
<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0"
xmlns:blogChannel="http://backend.userland.com/blogChannelModule"
>

<channel>
<title>&#x30E1;&#x30FC;&#x30EB;</title>
<link>http://link.com</link>
<description>&#x30E1;&#x30FC;&#x30EB;</description>
<language>ja</language>
<pubDate>Thu, 23 Aug 1999 07:00:00 GMT</pubDate>
<lastBuildDate>Thu, 23 Aug 1999 16:20:26 GMT</lastBuildDate>

<item>
<title>&#x30E1;&#x30FC;&#x30EB;</title>
<link>http://link.com</link>
</item>
</channel>
</rss>

Weiss einer was XML:RSS falsch macht oder warum der das umkodiert?

Danke! && MfG bert2002

Molaf
26-04-2010, 09:56
Hallo Bert,

ich habe auch regelmäßig das Problem mit utf8 und encode.

Oft liegt es am Texteditor, der eben nicht in utf-8 speichert (von notepad++ gespeichert dann in geany weiterverarbeitet und umgekehrt).

Meine erster Versuch ist dann ein Auskommentieren von use utf8; , das bringt meistens den Erfolg (wenn schon Auskommentiert, dann umgekehrt).

Klingt nicht sehr wissenschaftlich aber utf8 ist ja auch noch jünger als 20 Jahre, von daher kann man nicht mit einer stabilen Umsetzung rechnen :).

Gruß,
Molaf

bert2002
26-04-2010, 13:10
Hallo Bert,

ich habe auch regelmäßig das Problem mit utf8 und encode.

Oft liegt es am Texteditor, der eben nicht in utf-8 speichert (von notepad++ gespeichert dann in geany weiterverarbeitet und umgekehrt).

Meine erster Versuch ist dann ein Auskommentieren von use utf8; , das bringt meistens den Erfolg (wenn schon Auskommentiert, dann umgekehrt).

Klingt nicht sehr wissenschaftlich aber utf8 ist ja auch noch jünger als 20 Jahre, von daher kann man nicht mit einer stabilen Umsetzung rechnen :).

Gruß,
Molaf

Das ist leider nicht die Loesung des Problemes ;)

Molaf
26-04-2010, 14:30
Ups...

Schande über mich, ich habe Deine Code- und Ausgabe-Beispiele nur überflogen und gleich meinem utf8-Beissreflex nachgegeben.

Das RSS ist valides XML und da sind Sonderzeichen (quasi alles außer ASCII aus amerikanischer Sicht) eben maskiert.

Dieses Testprogramm hier läd das RSS wieder und prüft dann den Inhalt erneut - valides utf8-Zeichen.

Somit ist alles in Ordnung mit dem RSS (wenn ich diesmal genau aufgepasst habe :)).


#!/usr/bin/perl

use strict;

use utf8;
use Encode qw/encode decode/;

use XML::Simple;

# RSS wieder einlesen
my $tree = XMLin("test.xml");
# Eingabewert wieder holen
my $name = $tree->{channel}{title};

# kurze Kontrolle
print length($name),"\n";
# (die Zeichen werden in der Windowskonsole eh nicht angezeigt)

my $check = utf8::valid($name);
print "is utf valild?: $check\n";

bert2002
28-04-2010, 17:22
Ups...

Schande über mich, ich habe Deine Code- und Ausgabe-Beispiele nur überflogen und gleich meinem utf8-Beissreflex nachgegeben.

Das RSS ist valides XML und da sind Sonderzeichen (quasi alles außer ASCII aus amerikanischer Sicht) eben maskiert.

Dieses Testprogramm hier läd das RSS wieder und prüft dann den Inhalt erneut - valides utf8-Zeichen.

Somit ist alles in Ordnung mit dem RSS (wenn ich diesmal genau aufgepasst habe :)).


#!/usr/bin/perl

use strict;

use utf8;
use Encode qw/encode decode/;

use XML::Simple;

# RSS wieder einlesen
my $tree = XMLin("test.xml");
# Eingabewert wieder holen
my $name = $tree->{channel}{title};

# kurze Kontrolle
print length($name),"\n";
# (die Zeichen werden in der Windowskonsole eh nicht angezeigt)

my $check = utf8::valid($name);
print "is utf valild?: $check\n";


Ja da hast du vollkommen recht. Was ich bemerkt habe ist das XML::RSS genau richtig encoded, aber genau das wollte ich nicht ;) Mit der Option "encode_output=>'0'" kann man es deaktivieren.

Danke fuer den ausschlaggebenden Hinweis.

Danke! && MfG bert2002