Thread From : UTF-16LE => To : UTF8
(15 answers)
Opened by etsej at 2011-03-21 16:39
Interessante Sache das...
Folgende Lösungen funktionieren: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #!/usr/bin/perl use strict; use warnings; use Encode; my $from = $ARGV[0]; my $to = $ARGV[1]; my $in_file = $ARGV[2]; my $out_file = $ARGV[3]; open my $input, "<", $in_file or die "$!"; open my $output, ">", $out_file or die "$!"; local $/ = undef; my($raw_octets,$perl_scalar,$utf8_octets); while($raw_octets = <$input>){ $perl_scalar = decode($from, $raw_octets); $utf8_octets = encode($to, $perl_scalar); print $output $utf8_octets; } close($input); close($output); Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #!/usr/bin/perl use strict; use warnings; use Encode qw(from_to); my $from = $ARGV[0]; my $to = $ARGV[1]; my $in_file = $ARGV[2]; my $out_file = $ARGV[3]; open my $input, "<", $in_file or die "$!"; open my $output, ">", $out_file or die "$!"; local $/ = undef; while(my $octets = <$input>){ from_to($octets,$from,$to); print $output $octets; } close($input); close($output); Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #!/usr/bin/perl use strict; use warnings; use Encode; my $from = $ARGV[0]; my $to = $ARGV[1]; my $in_file = $ARGV[2]; my $out_file = $ARGV[3]; open my $input, "<:encoding($from)", $in_file or die "$!"; open my $output, ">:encoding($to)", $out_file or die "$!"; while(<$input>){ print $output $_; } close($input); close($output); Bei den oberen beiden hat es etwas gedauert, bis ich auf die Idee kam, $/ auf undef zu setzen. Bei UTF-16LE entstehen wohl Linebreaks, die eigentlich keine sind. Tss tss tss, so kommt man an die grauen Haare... EDIT: Es ist der Linebreak selbst, der in UTF-16LE aus chr(10) und chr(0) besteht. Das chr(0) wandert in die nächste Zeile und dann gibt es nur noch Datenmüll. Es geht also auch so: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #!/usr/bin/perl use strict; use warnings; use Encode qw(from_to); my $from = $ARGV[0]; my $to = $ARGV[1]; my $in_file = $ARGV[2]; my $out_file = $ARGV[3]; open my $input, "<", $in_file or die "$!"; open my $output, ">", $out_file or die "$!"; if($from eq 'UTF-16LE'){ $/ = "\012\000"; } while(my $octets = <$input>){ from_to($octets,$from,$to); print $output $octets; } close($input); close($output); Last edited: 2011-03-22 15:26:15 +0100 (CET) |