Okeydokey-
hier das vorläufige Zwischenergebnis einiger Testreihen.
Dein Formular ist offensichtlich mangelhaft.
Nö- es ist mit deinem fast identisch:
use CGI;
use CGI::Carp qw(fatalsToBrowser);
$CGI::POST_MAX = 1024 * 100;
$CGI::DISABLE_UPLOADS = 1;
use Encode qw(decode encode);
use utf8;
use strict;
my ($test, $noutf);
$cgi=new CGI;
$xline=$cgi->param('test');
#$xline=UTF-Line von Feed (z.B. "Überflieger dröhnen ärgerlich")
$noutf=decode 'UTF-8', $xline, Encode::FB_CROAK | Encode::LEAVE_SRC;
#Habe ich jetzt mal von dir übernommen, aber ein schlichtes
#$noutf = decode("UTF-8", $xline); geht genauso
print $cgi->header(-charset => 'UTF-8'),
$cgi->start_html(-title => '+++ test',
-encoding => 'UTF-8'),
$cgi->p($noutf), # !!!
$cgi->start_form(-method => 'post',
-action => 'test.pl'
'-accept-charset' => 'UTF-8'),
$cgi->start_table()."\n",
$cgi->Tr($cgi->td('TEST:'),
$cgi->td($cgi->textfield(-name =>'test', -size => 80, -value => $noutf)))."\n",
$cgi->Tr($cgi->td('kommentar'), $cgi->td(
$cgi->textarea(-name =>'comment', -rows => 10, -columns => 70)))."\n",
$cgi->Tr($cgi->td('+++'),
$cgi->td($cgi->submit(-name =>'los', -value =>'los')))."\n",
$cgi->end_table(),
$cgi->end_form(),
$cgi->end_html();
Lustig dabei:
Die testweise Ausgabe
$cgi->p($noutf),
hat das erwartbare Ergebnis: Umlaute werden nicht korrekt angezeigt.
Bei der Ausgabe im Textfield aber sehr wohl!
Zwischendurch habe ich den Output des Formulars mal durch eine schlichte Testroutine geschickt:
$cgi=new CGI;
@all=$cgi->param();
print "Content-Type: text/html; charset=UTF-8\n\n";
foreach (@all)
{
$val=$cgi->param($_);
if (is_utf8($val))
{
print "UTF-8: ";
}
else
{
print "Nope: ";
}
print "$val<br>";
}
Tja: Hier kommt bei allen Werten "Nope"- also kein UTF-8 (?)
Firefox erkennt das allerdings als Zeichenkodierung und zeigt alle Umlaute korrekt an.
Das verarbeitende Script macht hauptsächlich
use XML::DOM;
use CGI qw(-utf8);
use CGI::Carp qw(fatalsToBrowser);
use utf8;
use bytes;
$cgi=new CGI;
$test=$cgi->param('test');
$comment=$cgi->param('comment');
$parser=XML::DOM::Parser->new();
$doc=$parser->parsefile($file);
$root=$doc->getDocumentElement();
$entries=$doc->getElementsByTagName("entry");
$new=$doc->createElement("entry");
$xtest=$doc->createElement("test");
$xtest->addText($test);
$xtest=$doc->createElement("comment");
$xtest->addText($comment);
$new->appendChild($comment);
$root->insertBefore($new,$entries->item(0));
open my $utf, ">:utf8", $file or die $!;
$doc->print($utf);
$doc->dispose;
Also 08/15.
Und der Parser gibt die Entries nochmal einzeln aus.
Der Knackpunkt scheint also die Schreibroutine zu sein. Egal, was ich versuche, das Resultat ist immer:
Im Comment sind die Umlaute ok, im Test-Element nicht.
Versuche ich hier nochmal
$tst2=decode 'UTF-8', $test, Encode::FB_CROAK | Encode::LEAVE_SRC;
Steigt der Parser beim Auslesen mit
utf8 "\xFC" does not map to Unicode at (...)
aus.
Gibts noch andere Möglichkeiten, per XML::DOM zu schreiben?
(Achja: $doc->printToFile($file) zerschießt das ganze Dokument, so dass es kein Parser mehr lesen kann)
Grüße
Zaphod