Tach!
Vorab: Ich kenne Perl so gut wie gar nicht, kann dir also nur allgemein antworten.
Ich habe hier einen Schwung Daten via CGI zu unicodieren und leider das Problem, dass sich in einem Feld bereits UTF-8-Daten befinden und probiere schon eine Weile daran herum, eine Doppelkodierung zu vermeiden.
Was ist "Feld" in deinem Fall?
Der simpelste Versuch
use Encode;
$test=decode("UTF-8",$string); (mit "utf8" übrigens auch nicht)
klappte nicht, entflaggen
Encode::_utf8_off($string);
ebensowenig wie transkodieren
from_to($string,"utf8","latin1");
Bekanntes Resultat ist immer: Vermurkste Umlaute/ß/"
"Klappt nicht" ist genauso wenig hilfreich wie "vermurkste Umlaute". Aus diesen Aussagen kann ich dir keinen Erklärungsversuch generieren, der bei der Ursachenermittlung helfen könnte. Also bitte: Was sind die Eingabedaten (wenn möglich die problematischen Teile auch in Hex-Darstellung), was ist das konkrete Ergebnis?
Der letzte Ansatz scheint mir eigentlich logisch, die Frage wäre aber: Welches Format haben eigentlich Daten zunächst, die in ein per CGI so
$cgi->header(-charset => 'UTF-8'),
$cgi->start_html(-encoding => 'UTF-8'),
$cgi->start_form(-method => 'post',
generiertes Formular eingegeben werden?
Sie haben genau die Kodierung, die der Browser verwendet. Wenn an ihm nichts verstellt ist, nimmt er üblicherweise die Kodierung, die für die Seite verwendet wurde, die das Formular enthält. Die Reihenfolge, wo der Browser die Kodierungsangabe sucht, findest du unter "Beachten Sie" am Ende des Abschnitts "In Richtung Client" von http://wiki.selfhtml.org/wiki/Themen:Zeichencodierung/Webserver. Beim Formular (form-Element) kommt noch das Attribut accept-charset hinzu, das einige Browser beachten und welches die anderen Angaben übertrumpfen soll.
(Und die dumme Frage: Kann man eigentlich doppelt DEkodieren?)
Du kannst so oft kodieren und dekodieren, wie du lustig bist. Ob dabei sinnvolle Dinge rauskommen ist eine andere Frage.
a & b -> HTML-Kodieren: a & b -> HTML-Kodieren: a & b
a & b -> HTML-Dekodieren: a & b -> HTML-Dekodieren: a & b -> HTML-Dekodieren: a & b (aber eigentlich Syntaxfehler)
Dekodieren gibt es bei Zeichenkodierungen im Prinzip nicht, die Zeichen liegen (während der Verarbeitung) immer in irgendeiner Form der Kodierung vor. Du kannst lediglich umkodieren. Wenn du allerdings einen ISO-8859-1-Text mit Zeichen oberhalb von x7F als UTF-8 zu interpretieren versuchst, gibt es Zeichenverlust.
dedlfix.