Schrift
[thread]8395[/thread]

Unicode, WWW::Mechanize und Unicode::String



<< >> 4 Einträge, 1 Seite
J-jayz-Z
 2006-10-06 13:45
#70562 #70562
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hi,

ich hab ein kleines Problem mit UTF-8 und WWW::Mechanize.
Ich hole mir mit diesem Modul die Inhalte einer Webseite und will diese in eine Datenbank sichern. Ich bekomme die Inhalte als UTF-8 obwohl sie als ISO-8859-1 ausgeliefert wird. Dann dacht ich mir, wandel die Inhaöte doch einfach um, bevor man sie in die DB sichert, jetzt fehlt dann allerdings ö,ä,ü und ß. Zum umwandeln der Strings hab ich folgende Methode benutzt:
Code: (dl )
1
2
3
4
sub utf8ToLatin {
my $utfString = new Unicode::String(shift);
return $utfString->latin1();
}

jemand ne Idee ?
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
ptk
 2006-10-07 02:25
#70563 #70563
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Versuch doch mal Encode::encode().
J-jayz-Z
 2006-10-07 18:43
#70564 #70564
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Das ging auch nicht. Ich hab das Problem jetzt aber gelöst, indem ich den Crawler in Java geschrieben habe. Das Problem war einfach nur, die fehlende Funktionalität das charset selbst anzugeben. Auf der Seite fehlt der meta Tag, in dem man das auszuliefernde charset angibt, daran orientiert sich WWW::Mechanize. Wenn es keins gibt, wird einfach utf-8 verwendet. Also gingen die Umlaute schon kaputt, bevor ich sie überhaupt versuchte umzuwandeln. In Java kann man als 2tes Argument der Klasse InputStreamReader den charset angeben. Nachdem ich da iso-8859-1 angegeben hatte, ging es.

Leider musste ich auf Java umsteigen, da ich auf die Schnelle keine Möglichkeit gefunden hatte, den charset zu ändern in WWW::Mechanize - und der Kunde wollte es schnell haben. Mich würde trotzdem interessieren, ob da jemand eine Möglichkeit kennt ?
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
ptk
 2006-10-07 19:27
#70565 #70565
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ich konnte das Problem nicht reproduzieren. Als Testdatei habe ich folgendes verwendet (wobei die Umlaute in iso-8859-1 enkodiert sind):
Code: (dl )
1
2
3
4
5
6
7
8
<html>
<head>
<title>Test iso-8859-1</title>
</head>
<body>
Hallo äöüß
</body>
</html>

Der Apache fügt von sich aus keine Content-Type-Header hinzu:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
$ lwp-request -m HEAD http://www/~eserte/test/enc-iso88591.html
200 OK
Connection: close
Date: Sat, 07 Oct 2006 15:24:28 GMT
Accept-Ranges: bytes
ETag: "fed8eb-5f-4527c67e"
Server: Apache/1.3.34 (Unix) mod_perl/1.29
Content-Length: 95
Content-Type: text/html
Last-Modified: Sat, 07 Oct 2006 15:23:42 GMT
Client-Date: Sat, 07 Oct 2006 15:24:28 GMT
Client-Peer: 192.168.1.5:80
Client-Response-Num: 1

Mit einem minimalen WWW-Mechanize-Skript kommt nicht Überraschendes heraus:
Code: (dl )
1
2
3
4
use WWW::Mechanize;
my $ua = WWW::Mechanize->new;
my $resp = $ua->get("http://www/~eserte/test/enc-iso88591.html");
use Devel::Peek; Dump $resp->content;

Das Ergebnis:
Code: (dl )
1
2
3
4
5
6
SV = PV(0x82166b0) at 0x82e75c8
REFCNT = 1
FLAGS = (TEMP,POK,pPOK)
PV = 0x83f4518 "<html>\n <head>\n <title>Test iso-8859-1</title>\n </head>\n <body>\n Hallo \344\366\374\337\n </body>\n</html>\n"\0
CUR = 95
LEN = 96

Also weiterhin alles in iso-8859-1. Und auch wenn ein UTF8-Flag hier vorkommen würde, dann hättest du mit Encode::encode dein gewünschtes Ergebnis bekommen.
<< >> 4 Einträge, 1 Seite



View all threads created 2006-10-06 13:45.