Leser: 37
2011-01-04T08:53:51 GlasperlenspielerIch musss – zur Weiterverarbeitung mit einem älteren Programm – immer wieder mal zehntausende Textdateien aus UTF-8 nach Win Latin-1 (iso-8859-1) konvertieren. Dazu habe ich bisher einfach iconv verwendet, das aber den Dienst verweigert, wenn einzelne Zeichen nicht im Zielzeichensatz enthalten sind.
Gibt es denn eine Möglichkeit, irgendwie die Zeichen zu identifizieren, die im Zielzeichensatz nicht enthalten sind?
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
#!/usr/bin/perl use Encode qw/from_to/; #cat utf8.txt | perl -MEncode=from_to -pe 'from_to($_,"utf8","latin1");' while (<DATA>) { print "Original: $_"; from_to($_,"utf8","latin1"); print; } __DATA__ Das ist ein tödlicher Täst für die 1€ (nicht ganz kostenlose!) Programmierung. ÄÖÜß =AeOeUeSz ΔΦΚ =Delta Phi Kappa 訁=U+8A01 (CJK) א =Aleph U+05D0 € =Euro Š š =Scaron scaron Ž ž =Zcaron zcaron Œ œ =Oe oe Ÿ =Yideresis ¤ =Yen ¦ =Bar ¨ =Dieresis ´ =Tick ¸ =cedille ¼ ½ ¾ =1/4 1/2 3/4
1 2 3 4 5 6 7 8 9 10 11 12 13
#!/usr/bin/perl use strict; use warnings; use Encode qw/from_to/; my $DEBUG = 0; while (<>) { print STDERR "Original: $_" if $DEBUG; from_to($_,"utf8","latin1"); print; }
QuoteCannot decode string with wide characters at /System/Library/Perl/5.10.0/darwin-thread-multi-2level/Encode.pm line 182
from_to($_,"utf8","latin1");
from_to($_,"utf8","latin1", Encode::FB_QUIET);
from_to($_,"utf8","latin1", Encode::FB_DEFAULT);
from_to($_,"utf8","latin1", sub{printf("Keine Entsprechung: U+%04X\n",$_[0])});
2011-01-04T08:53:51 GlasperlenspielerUTF-8 nach Win Latin-1 (iso-8859-1) konvertieren.
QuoteDazu habe ich bisher einfach iconv verwendet,
QuoteHexcode 80 is in Windows-1252 das Euro Zeichen.
iconv -f WINDOWS-1252 -t UTF8 win1252_file -o utf8_file
führt zu:
e2 82 ac
iconv -f UTF8 -t ISO-8859-1 utf8_file iso8859-1_file
iconv: illegal input sequence at position 0
recode UTF-8..ISO-8859-1 utf8_file
ergibt
45 55 52 Das sind die Glyphen EUR
QuoteGibt es denn eine Möglichkeit, irgendwie die Zeichen zu identifizieren, die im Zielzeichensatz nicht enthalten sind? Dann ließen sich dafür im Vorfeld sinnvolle Ersetzungen finden.
QuoteDir ist klar, das Win Latin-1 nicht ISO-8859-1 ist?
QuoteProbier mal recode.
QuoteWie zuvor schon jemand schrieb: Was soll dann damit passieren?
1 2 3 4 5 6 7 8 9 10
#!/usr/bin/perl use strict; use warnings; binmode(STDIN); my %found; while(<STDIN>) { while(/((?:(?:[\xF0-\xF4][\x90-\xBF]|[\xE0-\xEF])[\x80-\xBF]|[\xC2-\xDF])[\x80-\xBF])/g) { print "UTF-8 CHAR: $1\n" unless( $found{$1}++ ); } }
perl print_utf8_chars.pl < text.txt
2011-01-04T21:46:19 topegHier ein kleines Script, welches alle UTF-8 Zeichen in einem Text ausgibt.
2011-01-04T20:19:54 GlasperlenspielerQuoteDir ist klar, das Win Latin-1 nicht ISO-8859-1 ist?
Macht das denn in der Praxis einen Unterschied oder ist das etwas, über das man hinwegsehen kann?!
2011-01-04T20:19:54 GlasperlenspielerQuoteDir ist klar, das Win Latin-1 nicht ISO-8859-1 ist?
Macht das denn in der Praxis einen Unterschied oder ist das etwas, über das man hinwegsehen kann?!
QuoteQuoteWie zuvor schon jemand schrieb: Was soll dann damit passieren?
Hmpf, habe ich das nicht schon beantwortet? Mir geht es im Endeffekt darum, eine Liste der Zeichen zu erhalten, die nicht konvertiert werden können.
QuoteSchon klar. Nur was machst du dann damit. Nehmen wir mal an du hast dann ISO-8859-1 mit besonders codierten Zeichen alla HTML. Was nutzt das? Programme müssen das ja auch interpretieren können. Gibt es Programme die ISO-8859-1 gemischt mit bspw. UTF8 richtig interpretieren? Selbst wenn, klingt das recht ungewöhnlich.
QuoteIch habe gerade schon mal ein bisschen mit recode herumexperimentiert, brauche dafür aber definitv noch etwas mehr Zeit (=> Wochenende!). Das mit den Zeichensätzen ist'n ziemlicher Scheiß. :-)