[LUGA] Mit freundlicher Unterstützung von:
Linux New Media AG

Mail Thread Index


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[luga] Perl UTF8 nochmal ...



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));}



powered by LINUX the choice of a gnu generation
linux user group austria;
Suche
Suche
Letzte Änderung:
webmaster@luga.at
September 2010