Schrift
[thread]476[/thread]

Lib::XML, HTML::Entities, utf8, Perl5.6 vs Perl5.8



<< |< 1 2 >| >> 12 Einträge, 2 Seiten
esskar
 2005-04-07 08:37
#4756 #4756
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Hi.
Mein Entwicklungssystem ist WinXP mit Perl5.8.6.
Die Productionsmaschine ist Linux mit Perl5.6.1.

Der Content-Charset ist 'utf8'.

Folgendes XML-File:
Code: (dl )
1
2
3
<?xml version="1.0" encoding="iso-8859-1"?>

<entry name="button_close">Schließen</entry>


Den Text 'Schließen' lese ich nun mit folgendem Code aus:
Code: (dl )
1
2
3
4
5
6
7
my $value = $node->textContent;
my $valueEnc = &HTML::Entities::encode_entities(
&XML::LibXML::encodeToUTF8(
$self->{xmldoc}->encoding,
$value
)
);


$self->{xmldoc}->encoding ist nun also 'iso-8859-1';
wenn ich mir nun den Output im Browser anschaue, sieht es wie folgt aus:

5.8 => Schlie&szlig;en (Browser: richtig)
5.6 => Schlie&Atilde;&ƒ&Acirc;&Ÿen (Browser: falsch)

lasse ich HTML::Entities::encode_entities weg, komme ich zu folgendem ergebnis:

5.8 => Schließen (Browser: falsch)
5.6 => Schließen (Browser: falsch)

Wo genau steckt den der Fehler und wie behebe ich das ganze?
renee
 2005-04-07 11:47
#4757 #4757
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Skript:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#! /usr/bin/perl -w

use strict;
use warnings;
use CGI;
use Data::Dumper;
use CGI::Carp qw(fatalsToBrowser);
use lib ('./perllib');
use XML::Simple;
use utf8;

my $file = './test.xml';
my $content = get_file($file);
my $html = ();

my $cgi = CGI->new();
print $cgi->header(-type => 'text/html');

my $jobs_h = XMLin($content);

print Dumper($jobs_h);

my $jobtitle = $cgi->escapeHTML($jobs_h->{content});
$jobtitle =~ s/([\x{80}-\x{FFFF}])/'&#' . ord($1) . ';'/gse;

print $jobtitle;


sub get_file{
my ($file) = @_;
my $cont = '';
{
local $/;
open(DAT,"<$file") or die $!;
$cont = <DAT>;
close DAT;
}
return $cont;
}


XML:
Code: (dl )
1
2
3
<?xml version="1.0" encoding="iso-8859-1"?>

<entry name="button_close">Schließen</entry>


Darstellung: siehe http://www.renee-baecker.de/renee_cgi/utf_acht.cgi
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
esskar
 2005-04-07 12:50
#4758 #4758
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
welche perl version hast du?
schick mal charset=utf8!
renee
 2005-04-07 12:53
#4759 #4759
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
This is perl, v5.6.1 built for i386-linux

Copyright 1987-2001, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using `man perl' or `perldoc perl'. If you have access to the
Internet, point your browser at http://www.perl.com/, the Perl Home Page.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
esskar
 2005-04-07 12:55
#4760 #4760
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
kann man unter Perl 5.6.1 immer schon "use utf8;" sagen?
ptk
 2005-04-07 14:12
#4761 #4761
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Wozu benutzt du encodeToUTF8? Der String ist doch schon utf8!
esskar
 2005-04-07 19:00
#4762 #4762
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=ptk,07.04.2005, 12:12]Wozu benutzt du encodeToUTF8? Der String ist doch schon utf8![/quote]
echt? steht das wo? hab ich das jetzt überlesen?
esskar
 2005-04-07 19:53
#4763 #4763
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=renee,07.04.2005, 09:47]
Code: (dl )
1
2
3
4
use utf8;
...
$jobtitle =~ s/([\x{80}-\x{FFFF}])/'&#' . ord($1) . ';'/gse;
...
[/quote]
scheint wirklich zu gehen;
seit wann kann man denn "use utf8;" sagen?
ptk
 2005-04-07 22:34
#4764 #4764
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=esskar,07.04.2005, 17:00][quote=ptk,07.04.2005, 12:12]Wozu benutzt du encodeToUTF8? Der String ist doch schon utf8![/quote]
echt? steht das wo? hab ich das jetzt überlesen?[/quote]
Mach einfach Devel::Peek::Dump($variable), dann siehst du, wie ein String intern kodiert ist. Dort erkennst du auch leicht, ob ein String faelschlicherweise doppelt in utf-8 kodiert ist.

Zu der anderen Frage: "use utf8" braucht man bei perl5.8.x nur, wenn man in seinen Strings und Regexps utf-8-Zeichen hinschreiben will und nicht die \x{....}-Notation verwenden will. Sonst normalerweise *nicht*, insbesondere braucht man sich nicht darum zu kuemmern, ob die Daten utf-8 sind oder nicht. Bei 5.6.x braucht man "use utf8" etwas oefter, aber Unicode-Support ist ja bei 5.6.x buggy. In 5.005 und frueher gab es keinerlei Unicode-Support.

Ich habe ein bisschen rumexperimentiert und bekomme unter 5.6.2 das richtige Ergebnis nur, wenn ich die Regexp aus encode_entities selber ausfuehre und davor "use utf8" gesagt habe. Vielleicht waere es das Gescheiteste, wenn man HTML::Parser fuer 5.6.x patchen wuerde. Am Gescheitesten ist es aber, ein Upgrade auf 5.8.x machen, denn, wie gesagt, utf-8 ist auf aelteren Perl-Version seeehr buggy.
esskar
 2005-04-07 22:39
#4765 #4765
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=ptk,07.04.2005, 20:34]Am Gescheitesten ist es aber, ein Upgrade auf 5.8.x machen, denn, wie gesagt, utf-8 ist auf aelteren Perl-Version seeehr buggy.[/quote]
sag das mal meinem Provider;
hab zwar schon ne Mail geschrieben und auch schon ne Antwort erhalten, aber zufrieden bin ich mit der nicht! :)
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2005-04-07 08:37.