|
Mit freundlicher Unterstützung von:
|
Liebe LuGA,
der Erfolg von Peters Rat zu meiner letzten Anfrage war leider nicht
von großer Dauer. Ich kann jetzt zwar korrektes Patternmatching mit UTF8
Zeichen machen und auch Scripst schreiben, die UTF8 korrekt einlesen und
ausgeben, mit der internen Verarbeitung hakt es aber noch:
Das Script liest jetzt eine UTF8 Datei ein (man muss es sich ja nicht
unnötig verkomplizieren) und soll eben dann, wenn ein gecos String mit
Sonderzeichen daherkommt, diesen Base64 codieren:
[begin scriptfragment]
#!/usr/bin/perl -w
use strict;
use utf8;
#use encoding "utf8"; # wenn ich das aktiviere klappt kein
Patternmatching
use Encode 'decode';
use Encode 'encode';
use MIME::Base64;
binmode(STDOUT, ":utf8");
binmode(STDIN, ":utf8");
[...]
open (USERS, "<:utf8", "user_utf8.csv") or die "cannot read
userlist:\n$!\n";
while (<USERS>){
[...]
my @value = split /;/;
[...]
foreach my $val (@value) {
next if (($fieldname[$c] eq 'country') or ($fieldname[$c] eq
'region') or ($
val =~ /^$/));
if ( $val=~ /[^a-z,A-Z\d\s\/\.,-_]/) {
print "$fieldname[$c]:: ".MIME::Base64::encode(encode("utf8",
$val));
print "$fieldname[$c]:: ".encode("utf8", $val); # zur Kontrolle
}
else {
print "$fieldname[$c]: $val\n";
}
++$c;
}
[end scriptfragment]
So. Und wenn ich jetzt mein Script aufrufe: "./user-ldif.pl >
user.ldif" dann kommen in die gecos Zeilen, die nicht Base64 codiert
sind _vier_ Byte pro Sonderzeichen:
eine Zeile aus user_utf8.csv:
p2scwo;1014;100;.........mül............;/home/......;/bin/sh;AT;Partner
in Hex:
00000000 70 32 73 63 77 6f 3b 31 30 31 34 3b 31 30 30 3b
|p2scwo;1014;100;|
00000010 .. .. .. .. .. .. .. .. .. 6d c3 bc 6c .. .. ..
|.........m..l...|
00000020 20 .. .. .. .. .. .. .. 67 3b 2f 68 6f 6d 65 2f |
W.......;/home/|
00000030 .. .. .. .. .. .. 3b 2f 62 69 6e 2f 73 68 3b 41
|......;/bin/sh;A|
00000040 54 3b 50 61 72 74 6e 65 72 0a |T;Partner.|
0000004a
Die (nicht codierte) Zeile im LDIF:
00000000 67 65 63 6f 73 3a 3a 20 .. .. .. .. .. .. .. .. |gecos::
.......|
00000010 .. 6d c3 83 c2 bc 6c .. .. .. .. .. .. .. .. .. |.m....l...
....|
00000020 .. .. .. 68 6f 6d 65 44 69 72 65 63 74 6f 72 79
|...homeDirectory|
00000030 3a 20 2f 68 6f 6d 65 2f .. .. .. .. .. .. 6f 0a |:
/home/.......|
0000003f
Woher kommen jetzt die vier Byte "c3 83 c2 b2" ?
Laut Unicode Tabelle für Latin1 bedeutet "c3 83" NBH oder "no break
here" und "c2 b2" ist IMHO _nicht_ UTF8.
Ich habe ja in letzter Zeit viel über Unicode gelesen (die perldoc
Abschnitte dazu kann ich empfehlen) aber da steig ich aus.
Ideen ? ... Peter ? ;-)
Danke,
Goesta
--
#!/usr/bin/perl
foreach $c (split(/ /,"47 6f 65 73 74 61 20 53 6d 65 6b 61 6c 0d 0a")) {
print pack("C", hex($c));}
|
the choice of a gnu generation linux user group austria; |
Suche
|
Letzte Änderung:
webmaster@luga.at September 2010 |