zaphod: UTF-8 dekodieren (?)

Beitrag lesen

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