Thread From : UTF-16LE => To : UTF8 (15 answers)
Opened by etsej at 2011-03-21 16:39

kristian
 2011-03-22 15:00
#146779 #146779
User since
2005-04-14
684 Artikel
BenutzerIn
[Homepage] [default_avatar]
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)

View full thread From : UTF-16LE => To : UTF8