Thread Perl Output File in UTF-16 LE BOM Format (2 answers)
Opened by peterb at 2022-03-07 06:25

peterb
 2022-03-07 06:25
#194289 #194289
User since
2010-05-19
42 Artikel
BenutzerIn
[default_avatar]
Hallo Community!

Ich habe eine Applikation, die Files zur Konfiguration im UTF-16 LE BOM Format speichert.

Ich möchte diese Files mit einem Script backupen und danach werden sie geändert und zurück geschrieben. Ich weiss leider nicht wie ich dieses BOM Format speichern kann, ich schaffe nur UTF-16 LE, ohne BOM.

Kann mir jemand weiterhelfen, was dieses BOM eigentlich ist und wie ich den Output in diesem Format speichern kann?

Anbei ein Teil des Scripts:

Code: (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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# #!perl
use utf8;

my $Path = 'C:\\Programme\\Application\\Session';
my $iniFile = 'application.ini';

# read ini
my $conf = &iniRead ( $Path . "\\" . $iniFile);

# write ini
&iniWrite ( $Path . "application.bkp", $conf);


# - # - # - # - # - # - # - # - # - # - # - # - # - # - # - # - # - # - #
#
# Subs Subs Subs Subs Subs Subs
#
# - # - # - # - # - # - # - # - # - # - # - # - # - # - # - # - # - # - #

sub iniRead {

my $ini = $_[0];
my $conf;

open (INI, '<:raw:encoding(UTF-16LE):crlf', $ini) or die "Kann File $ini nicht zum lesen oeffnen: $!\n";
while (<INI>) {
chomp;

# non printable ascii chars -> [^ -~]*
if (/^[^ -~]*\[(.*?)\]$/) {
$section = $1;
}

if ( /^(.*?)\=(.*?)$/ ) {
$conf->{$section}->{$1} = $2;
}
}
close (INI);
return $conf;

}

sub iniWrite {

my $ini = $_[0];
my $conf = $_[1];
my $contents = '';

foreach my $section ( sort { (($b eq '_') <=> ($a eq '_')) || ($a cmp $b) } keys %$conf ) {

my $block = $conf->{$section};
$contents .= "\n" if length $contents;
$contents .= "[$section]\n" unless $section eq '_';
foreach my $property ( sort keys %$block ) {

$contents .= "$property=$block->{$property}\n";
# print "$property=$block->{$property}\n";

}
}

open( CONF,'>:raw:encoding(UTF-16LE):crlf', $ini ) or die "Kann File $ini nicht zum schreiben oeffnen: $!\n";
print CONF $contents;
close CONF;

}


Mit diesem Oneliner geht es, aber ich hab es nicht geschafft, dies im Script zu machen

Code: (dl )
C:\Users\appUser1> perl -pe "BEGIN { binmode $_, ':raw:encoding(UTF-16LE)' for *STDIN, *STDOUT };" <application.ini >application.bkp


Vielen Dank für eure Hilfe
Peter

View full thread Perl Output File in UTF-16 LE BOM Format