Thread Encoding - Wie funktioniert das? (16 answers)
Opened by giordano at 2013-12-04 11:11

giordano
 2013-12-09 16:56
#172506 #172506
User since
2011-04-29
16 Artikel
BenutzerIn
[default_avatar]
Ich arbeite mit Windows7 (sorry, hatte es vergessen). Ich habe aufgrund des Kommentars:

Quote
Mit "<:encoding(UTF-16)" sagst du perl: Hey perl die datei ist UTF-16 Wandle das in das perlinterne Format.
Perl benutzt intern eine Abart von UTF-8.
Das selbe kannst du auch bei der Ausgabe machen ">:encoding(UTF-16)". Damit sagts du perl: Hey wandle die perlkodierten Daten in UTF-16 und schreibe sie in die Datei.


den Code umgestaltet:
Code: (dl )
1
2
3
4
5
6
7
open INPUT, "<:encoding($enc)", "$dir0/$file" or die "File $file not found!";
open OUTPUT, ">:encoding($enc)", "$dir0/first100_$file" or die "File $file not found!";

while (<INPUT>) {
my $row_str2 = substr($_,0,500);
print OUTPUT $row_str2;
}


INPUT:
<?xml version="1.0" encoding="utf-16"?>

<meldung><konsultation><konsdate>2010-03-17</konsdate><patid>11205</patid><patyear>1970</patyear><patgender>male</patgender><arzt>7601000238436</arzt><diagnose><icpc>P06</icpc></diagnose>

Der Input (hexadecimal code) ist mit EMACS:
INPUT 1 2 3 4 5 6 7 8
00000000: fffe 3c00 3f00 7800 6d00 6c00 2000 7600 ..<.?.x.m.l. .v.
00000010: 6500 7200 7300 6900 6f00 6e00 3d00 2200 e.r.s.i.o.n.=.".
00000020: 3100 2e00 3000 2200 2000 6500 6e00 6300 1...0.". .e.n.c.
00000030: 6f00 6400 6900 6e00 6700 3d00 2200 7500 o.d.i.n.g.=.".u.
00000040: 7400 6600 2d00 3100 3600 2200 3f00 3e00 t.f.-.1.6.".?.>.
00000050: 0d00 0a00 3c00 6d00 6500 6c00 6400 7500 ....<.m.e.l.d.u.
00000060: 6e00 6700 3e00 3c00 6b00 6f00 6e00 7300 n.g.>.<.k.o.n.s.

und der Output:
<?xml version="1.0" encoding="utf-16"?>

਀㰀洀攀氀搀甀渀最㸀㰀欀漀渀猀甀氀琀愀琀椀漀渀㸀㰀欀漀渀猀搀愀琀攀㸀㈀ ㄀ ⴀ ㌀ⴀ㄀㜀㰀⼀欀

Hexadecimal (EMACS):
OUTPUT 1 2 3 4 5 6 7 8
00000000: feff 003c 003f 0078 006d 006c 0020 0076 ...<.?.x.m.l. .v
00000010: 0065 0072 0073 0069 006f 006e 003d 0022 .e.r.s.i.o.n.=."
00000020: 0031 002e 0030 0022 0020 0065 006e 0063 .1...0.". .e.n.c
00000030: 006f 0064 0069 006e 0067 003d 0022 0075 .o.d.i.n.g.=.".u
00000040: 0074 0066 002d 0031 0036 0022 003f 003e .t.f.-.1.6.".?.>
00000050: 000d 000d 0a00 3c00 6d00 6500 6c00 6400 ......<.m.e.l.d.
00000060: 7500 6e00 6700 3e00 3c00 6b00 6f00 6e00 u.n.g.>.<.k.o.n.

Offenbar finden da Veränderungen wärend des Umcodierens statt:
1) Zeile 0 / Kolonne 1: fffe -> feff
2) Zeile 0 / ab Kolonne 2: Einschiebung von 00
3) Zeile 5 / Kolonne 2: Einschiebung 000d

Wie kann ich das vermeiden?

Vielleicht noch zur Vorgeschichte: Die XML file sind sehr gross und würde gerne die ersten Zeilen herausschreiben und lesen. Dabei taucht eben dieses Codierungsproblem auf.

View full thread Encoding - Wie funktioniert das?