Schrift
[thread]12566[/thread]

Unicode UTF-16LE Dateien zusammenfügen oder anhängen

Tags: Ähnliche Threads

Leser: 2


<< >> 6 Einträge, 1 Seite
toppsino
 2008-09-30 20:57
#115038 #115038
User since
2006-07-29
18 Artikel
BenutzerIn
[default_avatar]
Hallo ich sitze hier vor meinem PC und blicke es einfach nicht.
Ich lese eine Datei im Format UTF-16LE ein, ersetze und verändere ein bisschen was und schreibe das ganze auch wieder in UTF-16LE. Alles ohne Problem.

Jetzt will ich die Ausgabedatei nicht neu schreiben sondern die Daten aus der Ursprungsdatei anhängen. Das passt dann nicht mehr, da bei der Ausgabe immer der (oder heisst es die?) BOM geschrieben wird.

Kann ich auch irgendwie nachvollziehen, aber wie macht man es richtig???
Kurz, wie hängt man zwei Unicode/UTF-XX Dateien korrekt aneinander?

DANKE
moritz
 2008-09-30 22:19
#115041 #115041
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
In der anzuhängenden Datei einfach ein $string =~ s/\A\x{FEFF}//; vor dem Schreiben machen (das geht davon aus, dass die Datei ordentlich dekodiert wurde).
Gast Gast
 2008-10-01 00:45
#115043 #115043
Ich spendiere mal etwas code, vielleicht hilft das ...

moritz+2008-09-30 20:19:40--
In der anzuhängenden Datei einfach ein $string =~ s/\A\x{FEFF}//; vor dem Schreiben machen (das geht davon aus, dass die Datei ordentlich dekodiert wurde).


Ich bekomme es leider nicht hin!
Die Datei datei1.utf enthält zum Beispiel
AB
CD
Das ist dann -> FF FE 41 00 42 00 ...
Wenn ich die Datei noch mal anhänge (s.u.) dann bekomme ich
FF FE 41 00 42 00 .... FF FE 41 00 42 00 ....

Ich dachte wenn ich die Datei korrekt lese - encoding(UTF-16LE) - dann habe ich kein FF FE das ich entfernen könnte. Kommt das nicht erst wieder beim schreiben hinzu? Sorry für die blöden Fragen, aber ich kenne mich noch nicht so gut mit Perl aus.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# UTF-16LE Dateien zusammenfügen
#This is perl, v5.8.8 built for MSWin32-x86-multi-thread
use strict;

my $in="datei1.utf";
my $out="datei2.utf";
my $ZEILE="";

open (IN,"<:encoding(UTF-16LE)","$in") || die "Kann $in nicht öffnen! $!";
open (OUT,">>:raw:encoding(UTF-16LE)","$out") || die "Kann $out nicht öffnen! $!";

while ($ZEILE=<IN>) {
# Hier könnte man dann alles mögliche mit $zeile machen
$ZEILE =~ s/\A\x{FFFE}//;
print OUT "$ZEILE";
}

close IN;
close OUT;
toppsino
 2008-10-01 00:46
#115044 #115044
User since
2006-07-29
18 Artikel
BenutzerIn
[default_avatar]
Ich spendiere mal etwas code, vielleicht hilft das ...

moritz+2008-09-30 20:19:40--
In der anzuhängenden Datei einfach ein $string =~ s/\A\x{FEFF}//; vor dem Schreiben machen (das geht davon aus, dass die Datei ordentlich dekodiert wurde).


Ich bekomme es leider nicht hin!
Die Datei datei1.utf enthält zum Beispiel
AB
CD
Das ist dann -> FF FE 41 00 42 00 ...
Wenn ich die Datei noch mal anhänge (s.u.) dann bekomme ich
FF FE 41 00 42 00 .... FF FE 41 00 42 00 ....

Ich dachte wenn ich die Datei korrekt lese - encoding(UTF-16LE) - dann habe ich kein FF FE das ich entfernen könnte. Kommt das nicht erst wieder beim schreiben hinzu? Sorry für die blöden Fragen, aber ich kenne mich noch nicht so gut mit Perl aus.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# UTF-16LE Dateien zusammenfügen
#This is perl, v5.8.8 built for MSWin32-x86-multi-thread
use strict;

my $in="datei1.utf";
my $out="datei2.utf";
my $ZEILE="";

open (IN,"<:encoding(UTF-16LE)","$in") || die "Kann $in nicht öffnen! $!";
open (OUT,">>:raw:encoding(UTF-16LE)","$out") || die "Kann $out nicht öffnen! $!";

while ($ZEILE=<IN>) {
# Hier könnte man dann alles mögliche mit $zeile machen
$ZEILE =~ s/\A\x{FFFE}//;
print OUT "$ZEILE";
}

close IN;
close OUT;
moritz
 2008-10-01 01:17
#115046 #115046
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
toppsino+2008-09-30 22:46:43--
Ich dachte wenn ich die Datei korrekt lese - encoding(UTF-16LE) - dann habe ich kein FF FE das ich entfernen könnte. Kommt das nicht erst wieder beim schreiben hinzu?


Nein, das ist nicht der Fall. Perl behandelt das BOM wie jedes andere Zeichen auch:

Code: (dl )
1
2
$ perl -we 'binmode STDOUT, ":encoding(UTF-16LE)"; print "AB"'|hexdump -C
00000000 41 00 42 00 |A.B.|


Du sieht, dass perl nicht automatisch ein BOM schreibt.

Das Problem ist, dass du probiert hast \x{FFFE} zu entfernen, nicht \x{FEFF}. Die Bytedarstellung ist zwar \x{FF}\x{FE} in little endian, aber beim dekodieren werden ja die beiden bytes verdreht, der Codepoint ist \x{FEFF}.

Bleibt mir noch, dich (wie jeden anderen Unicode-Frager hier) auf meinen Unicode+Perl-Artikel hinzuweisen ;-)
toppsino
 2008-10-01 01:27
#115047 #115047
User since
2006-07-29
18 Artikel
BenutzerIn
[default_avatar]
Juhu es geht!
Danke Moritz, auch für die Mühe, die du dir mit dem Tutorial gemacht hast. Ich habe zwar jetzt nur mal schnell quergelesen, denke aber das wird mir noch sehr hilfreich sein.
<< >> 6 Einträge, 1 Seite



View all threads created 2008-09-30 20:57.