perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 27
Click for quality!




11.02.2012 / 12:34

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


Beitrag(en|de)code und charsets problem
Seitenanfang
Hallo,

eine grundsätzliche Frage zu Perl und unicode/charsets... denn ich verzweifle hier gerade.

Ich versuche aus mehreren emails (Maildirformat) eine pdf-Datei zu generieren.
Dazu leses ich mit Email::Folder alle aus, entferne attachements mit Email::StripMIME, parse das Ganze mit Email::Simple und möchte nun ein Latex-Template mit den Textinhalten füllen um anschliessend pdflatex aufzurufen.

Leider meldet mir pdflatex aber direkt Fehler bzgl. ungültigem UTF-8...

Frage:

Wenn zB per Email::Simple der From-Header (alt. body()) ausgelesen wird, ist der doch in dem im Content-Header verzeichneten charset kodiert, oder?

Bedeutet: Ich muss mit
use Encode; encode('utf-8', $from)
diesen String erstmal in utf-8 umkodieren und kann anschliessend per ganz normalem print auf ein Filehandle utf-8 schreiben, oder? Oder hat perl den from-Header in der Variablen bereits als utf-8 gespeichert?

Mein Problem ist, auch im Terminal (utf-8 als charset eingestellt), werden nicht alle Zeichen korrekt angezeigt und pdflatex meldet bei "ganz normalen" Zeichen (unter 127) direkt schon Fehler:

! Package utf8x Error: Malformed UTF-8 sequence.

See the utf8x package documentation for explanation.
Type H <return> for immediate help.
...

l.54 \opening{Sehr geehrter Herr W. Test}

?

Hat da jemand eine Idee?

ps: habe schon versucht auf selfhtml Hilfe zu erhalten, dort kann bei Bedarf noch etwas genauer unter http://forum.de.selfhtml.org/?t=148913&m=966557&readmode=nested nachgelesen werden.

Datum: 22.03.2007-20:18

Beitragre: (en|de)code und charsets problem
Seitenanfang
Die Frage ist wie schreibst du die Daten in eine Datei oder wie über gibst du die Daten an an LaTeX.
Schon mal folgendes probiert?

open(TEX, '>:utf8', 'letter_utf8.tex') or die $!;
print TEX $data;
close(TEX);

Die Angabe von ':utf8' setzt für das Filehandle als Encoding 'UTF-8'.

Verwendest du 'use warnings' ? Erhälst du Warnung beim Ausführen des Scripts?

Datum: 22.03.2007-23:20

Beitragre: (en|de)code und charsets problem
Seitenanfang
Hallo - :)

Ja, danke für den Hinweis. Deine Antwort war Teil der Lösung.

Mitlerweile versteh ich utf8/unicode in Perl besser, war also eine gute Lehre.

0. Umgebungsvariable checken: "echo $LANG" (War bei mir ok, da 'en_US.UTF-8')
Perl nimmt STDIN/STDOUT/STDERR als $LANG per default an
1. "use utf8"
Da einige meiner strings im Quelltext des Scripts in utf-8 formatiert waren
2.

use Encode qw(encode decode _is_utf8);

Wobei _is_utf8 nicht nötig ist, decode oder pack tun das auch, mehr dazu in perluniintro
3. Immer wissen, welche charsets geliefert werden und blos nicht Perl das alleine entscheiden lassen (cf. auch http://ahinea.com/en/tech/perl-unicode-struggle.html )
4. mit
from_to(encode($charset, $body), $charset, 'utf-8')
von nicht-utf8 zu utf-8 konvertieren
5. utf8 strings gesondert behandeln und um doppelt-kodierungen zu vermeiden entweder
_is_utf8($string)
oder
$string = pack "U0C*", unpack "C*", $string;
anwenden
6. Wenn ein "wide character in print at ..." auftaucht, zus. auf das ausgebende filehandle
binmode <TEX>, ":utf8";
utf-8-fähig beschreiben

Mein Hauptproblem lag also darin, strings welche bereits utf-8 waren, doppelt zu kodieren und "legacy encodings" (alle anderen nicht-utf-8 gecodeten strings) vor der Ausgabe nicht ganz korrekt zu encoden. Daß Perl hier eigene heuristische Entscheidungen trifft, half nicht wirklich.

So, jetzt muß ich nur noch pdflatex-Ausgabe debuggen :)

danke!
fredj

Datum: 23.03.2007-10:34

-






-
-