Eine von mir so nicht erwartete Textersetzung
am 26.03.2007 04:55:40 von unknownPost removed (X-No-Archive: yes)
Post removed (X-No-Archive: yes)
Stefan Ram wrote:
> Das folgende Perl-Skript wurde UTF-8-kodiert gespeichert, was
> aber wahrscheinlich nicht ausschlaggebend für die Ausgabe ist.
Wahrschenlich doch. Lass es mal unter strict laufen. Dein
"pattern" ist ein 'latin1 - string - literal'.
> # This is perl, v5.8.3
> use utf8;
> my $s= "Business Celebration";
> $s =~ s/[^ ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzÄÖÜäöüß] /=/img;
> print $s, "\n";
>
> Die von mir erhaltene Ausgabe steht in der Kopfzeile
> »X-Output« dieses Postings. Der Leser kann so zunächst einmal
> überlegen, welche Ausgabe er erwartet.
Schon klar, hier wird ein UTF-8 String erwartet, es kommt
aber ein latin-1 Dingens in der Regex an, die dann nicht
unbedingt damit klarkommt.
versuch mal:
...
use utf8; #iso-8859-1
use Encode;
my $s= "Business Celebration";
my $stuff = encode('utf8', '^ ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzÄÖÜäöüß' );
$s =~ s{[$stuff]}{=}img;
print $s, "\n";
...
Viele Grüße
M.
Mirco Wahab wrote:
> Schon klar, hier wird ein UTF-8 String erwartet, es kommt
> aber ein latin-1 Dingens in der Regex an, die dann nicht
> unbedingt damit klarkommt.
Anmerkung: perldoc utf8
...
Note that if you have bytes with the eighth bit
on in your script (for example embedded Latin-1
in your string literals), use utf8 will be unhappy
since the bytes are most probably not well-formed
UTF-8. If you want to have such bytes and use utf8,
you can disable utf8 until the end the block (or
file, if at top level) by no utf8; .
...
Viele Grüße
M.
Mirco Wahab wrote:
> Mirco Wahab wrote:
>
>>Schon klar, hier wird ein UTF-8 String erwartet, es kommt
>>aber ein latin-1 Dingens in der Regex an, die dann nicht
>>unbedingt damit klarkommt.
>
> Anmerkung: perldoc utf8
>
> ...
> Note that if you have bytes with the eighth bit
> on in your script (for example embedded Latin-1
> in your string literals), use utf8 will be unhappy
> since the bytes are most probably not well-formed
> UTF-8. If you want to have such bytes and use utf8,
> you can disable utf8 until the end the block (or
> file, if at top level) by no utf8; .
> ...
Du bist auf dem falschen Dampfer. Mit UTF-8-Quelltext
tritt das Phänomen tatsächlich auf. Hier eine Minimalversion
des Programms:
#!/usr/bin/perl -w
use strict;
use utf8;
my $s= 'ss';
$s =~ s/[^sß]/=/i;
print $s,"\n";
__END__
=
o ohne i beim Substitute passiert es nicht
o Mit ISO 8859-1 Quelltext (ohne "use utf8") passiert auch es nicht
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
On 2007-03-26 07:30, Mirco Wahab
> Stefan Ram wrote:
>> Das folgende Perl-Skript wurde UTF-8-kodiert gespeichert, was
>> aber wahrscheinlich nicht ausschlaggebend für die Ausgabe ist.
>
> Wahrschenlich doch. Lass es mal unter strict laufen. Dein
> "pattern" ist ein 'latin1 - string - literal'.
Wie kommst Du auf die Idee? Stefan hat explizit dazugeschrieben, dass
das Script UTF-8-kodiert gespeichert wurde. Hast Du einen Grund, ihm das
nicht zu glauben?
>> # This is perl, v5.8.3
>> use utf8;
>> my $s= "Business Celebration";
>> $s =~ s/[^ ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzÃÃÃä öüÃ]/=/img;
>> print $s, "\n";
Schaut so aus, als ob "ignore case" mit der "manchmal, aber nicht immer"
Ãquivalenz von "Ã" und "SS" überfordert wäre. Wenn man das /i wegläÃt
(das in diesem Fall sowieso sinnlos ist, da Klein- und GroÃbuchstaben
explizit angeführt wurden), funktioniert es.
> use utf8; #iso-8859-1
> use Encode;
> my $s= "Business Celebration";
> my $stuff = encode('utf8', '^ ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzÃÃÃä öüÃ');
> $s =~ s{[$stuff]}{=}img;
Das ist Unsinn. Durch das encode zerlegst Du das "Ã" in zwei Bytes
\x{c3} \x{a4}. Damit wird Dein Substitute zu
$s =~ s{[^ ABC...\x{c3}\x{a4}...]}{=}img;
Es würde also (Latin-1 oder kompatibles vorausgesetzt) "Ã" und "¤" nicht
ersetzen, was nicht in Stefans Sinn ist.
hp
--
_ | Peter J. Holzer | Blaming Perl for the inability of programmers
|_|_) | Sysadmin WSR | to write clearly is like blaming English for
| | | hjp@hjp.at | the circumlocutions of bureaucrats.
__/ | http://www.hjp.at/ | -- Charlton Wilbur in clpm
Frank Seitz wrote:
> Mirco Wahab wrote:
>> Mirco Wahab wrote:
>>
>>> Schon klar, hier wird ein UTF-8 String erwartet, es kommt
>>> aber ein latin-1 Dingens in der Regex an, die dann nicht
>>> unbedingt damit klarkommt.
>> Anmerkung: perldoc utf8
>>
>> ...
>> Note that if you have bytes with the eighth bit
>> on in your script (for example embedded Latin-1
>> in your string literals), use utf8 will be unhappy
>> since the bytes are most probably not well-formed
>> UTF-8. If you want to have such bytes and use utf8,
>> you can disable utf8 until the end the block (or
>> file, if at top level) by no utf8; .
>> ...
>
> Du bist auf dem falschen Dampfer. Mit UTF-8-Quelltext
> tritt das Phänomen tatsächlich auf. Hier eine Minimalversion
> des Programms:
>
> #!/usr/bin/perl -w
>
> use strict;
> use utf8;
>
> my $s= 'ss';
> $s =~ s/[^sß]/=/i;
> print $s,"\n";
> __END__
> =
>
> o ohne i beim Substitute passiert es nicht
> o Mit ISO 8859-1 Quelltext (ohne "use utf8") passiert auch es nicht
Hallo Frank,
danke für den Tipp. Vielleicht
war ich ja auch nicht *ganzundgar*
auf dem Holzweg, denn mit explizitem
encode (utf8-Flag im String löschen)
geht es:
use Encode;
use utf8; #iso-8859-1
my $s = "sss";
my $nf = encode('UTF-8', '^sß');
$s =~ s{[$nf]}{=}ig;
print $s, "\n";
Viele Grüße & Danke
Mirco
Peter J. Holzer wrote:
> Wie kommst Du auf die Idee? Stefan hat explizit dazugeschrieben, dass
> das Script UTF-8-kodiert gespeichert wurde. Hast Du einen Grund, ihm das
> nicht zu glauben?
OK, mein Fehler. Ich hatte *mein Testskript* nicht unter
UTF-8 gespeichert und kam zu falschen Schlüssen. Sorry.
>> use utf8; #iso-8859-1
>> use Encode;
>> my $s= "Business Celebration";
>> my $stuff = encode('utf8', '^ ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzÄÖÜäöüß' );
>> $s =~ s{[$stuff]}{=}img;
>
> Das ist Unsinn. Durch das encode zerlegst Du das "Ä" in zwei Bytes
> \x{c3} \x{a4}. Damit wird Dein Substitute zu
>
> $s =~ s{[^ ABC...\x{c3}\x{a4}...]}{=}img;
>
> Es würde also (Latin-1 oder kompatibles vorausgesetzt) "Ã" und "¤" nicht
> ersetzen, was nicht in Stefans Sinn ist.
Verstehe ich nicht. Wenn beide Strings UTF-8 sind,
wieso sollte ich dann "Latin-1 oder kompatibles "Ã"
voraussetzen?
Viele Grüße & Danke
Mirco
On 2007-03-26 08:40, Frank Seitz
> Du bist auf dem falschen Dampfer. Mit UTF-8-Quelltext
> tritt das Phänomen tatsächlich auf. Hier eine Minimalversion
> des Programms:
>
> #!/usr/bin/perl -w
>
> use strict;
> use utf8;
>
> my $s= 'ss';
> $s =~ s/[^sÃ]/=/i;
> print $s,"\n";
> __END__
>=
>
> o ohne i beim Substitute passiert es nicht
> o Mit ISO 8859-1 Quelltext (ohne "use utf8") passiert auch es nicht
Mit dem Quelltext hat das glaube ich nichts zu tun: Es passiert dann,
wenn das Pattern UTF8 ist, der zu matchende String aber nicht:
#!/usr/bin/perl -CO
use warnings;
use strict;
for my $t (qw(bb bU Ub UU)) {
my $s = 'ss';
my $p = "[^s\x{DF}]";
if (substr($t, 0, 1) eq 'U') {
utf8::upgrade($s);
} else {
utf8::downgrade($s);
}
if (substr($t, 1, 1) eq 'U') {
utf8::upgrade($p);
} else {
utf8::downgrade($p);
}
$s =~ s/$p/=/ig;
print "$t $s\n";
}
__END__
ergibt:
bb ss
bU =
Ub ss
UU ss
Dementsprechend hilft auch ein
utf8::upgrade($s);
in Stefans Programm vor dem Match.
Ein Bug ist es IMHO trotzdem.
hp
--
_ | Peter J. Holzer | Blaming Perl for the inability of programmers
|_|_) | Sysadmin WSR | to write clearly is like blaming English for
| | | hjp@hjp.at | the circumlocutions of bureaucrats.
__/ | http://www.hjp.at/ | -- Charlton Wilbur in clpm
On 2007-03-26 09:15, Mirco Wahab
> Peter J. Holzer wrote:
>>> use utf8; #iso-8859-1
>>> use Encode;
>>> my $s= "Business Celebration";
>>> my $stuff = encode('utf8', '^ ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzÃÃÃä öüÃ');
>>> $s =~ s{[$stuff]}{=}img;
>>
>> Das ist Unsinn. Durch das encode zerlegst Du das "Ã" in zwei Bytes
>> \x{c3} \x{a4}. Damit wird Dein Substitute zu
>>
>> $s =~ s{[^ ABC...\x{c3}\x{a4}...]}{=}img;
>>
>> Es würde also (Latin-1 oder kompatibles vorausgesetzt) "Ã" und "¤" nicht
>> ersetzen, was nicht in Stefans Sinn ist.
>
> Verstehe ich nicht. Wenn beide Strings UTF-8 sind,
> wieso sollte ich dann "Latin-1 oder kompatibles "Ã"
> voraussetzen?
Weil Unicode zu Latin-1 in dem Sinn kompatibel ist, dass ein "Ã" (LATIN
CAPITAL LETTER A WITH TILDE) den Code 0xC3 hat (das gleiche gilt auch
für diverse andere Latin-x Varianten, z.B. Latin-9 (ISO-8859-1). Wenn Du
hingegen ISO-8859-7 verwendest, dann ist \x{C3} ein groÃes Gamma.
Du musst in Perl zwischen "Character-Strings, die intern in UTF8
gespeichert sind" und "Byte-Strings, die einen UTF-8 kodierten Text
enthalten" unterscheiden. Das ist nicht das gleiche!
hp
--
_ | Peter J. Holzer | Blaming Perl for the inability of programmers
|_|_) | Sysadmin WSR | to write clearly is like blaming English for
| | | hjp@hjp.at | the circumlocutions of bureaucrats.
__/ | http://www.hjp.at/ | -- Charlton Wilbur in clpm
Mirco Wahab wrote:
>
> danke für den Tipp. Vielleicht
> war ich ja auch nicht *ganzundgar*
> auf dem Holzweg, denn mit explizitem
> encode (utf8-Flag im String löschen)
> geht es:
>
> use Encode;
> use utf8; #iso-8859-1
> my $s = "sss";
> my $nf = encode('UTF-8', '^sß');
> $s =~ s{[$nf]}{=}ig;
> print $s, "\n";
Füge mal ein ß zu $s hinzu, dann siehst Du, dass
Dein Workaround nicht funktioniert. Die Begründung hatte
Peter schon gegeben.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
On 2007-03-26 09:13, Mirco Wahab
> danke für den Tipp. Vielleicht
> war ich ja auch nicht *ganzundgar*
> auf dem Holzweg, denn mit explizitem
> encode (utf8-Flag im String löschen)
> geht es:
>
> use Encode;
> use utf8; #iso-8859-1
> my $s = "sss";
> my $nf = encode('UTF-8', '^sÃ');
> $s =~ s{[$nf]}{=}ig;
> print $s, "\n";
Nein:
use Encode;
use utf8; #iso-8859-1
my $s = "sss\x{C3}";
my $nf = encode('UTF-8', '^sÃ');
$s =~ s{[$nf]}{=}ig;
print $s, "\n";
gibt aus:
sssÃ
hp
--
_ | Peter J. Holzer | Blaming Perl for the inability of programmers
|_|_) | Sysadmin WSR | to write clearly is like blaming English for
| | | hjp@hjp.at | the circumlocutions of bureaucrats.
__/ | http://www.hjp.at/ | -- Charlton Wilbur in clpm
Peter J. Holzer wrote:
> On 2007-03-26 08:40, Frank Seitz
>>
>>o ohne i beim Substitute passiert es nicht
>>o Mit ISO 8859-1 Quelltext (ohne "use utf8") passiert auch es nicht
>
> Mit dem Quelltext hat das glaube ich nichts zu tun:
Ich meinte damit, das es nur bei UTF-8 Encoding passiert.
> Es passiert dann, wenn das Pattern UTF8 ist, der zu
> matchende String aber nicht:
>
> #!/usr/bin/perl -CO
> use warnings;
> use strict;
>
> for my $t (qw(bb bU Ub UU)) {
> my $s = 'ss';
> my $p = "[^s\x{DF}]";
> if (substr($t, 0, 1) eq 'U') {
> utf8::upgrade($s);
> } else {
> utf8::downgrade($s);
> }
> if (substr($t, 1, 1) eq 'U') {
> utf8::upgrade($p);
> } else {
> utf8::downgrade($p);
> }
> $s =~ s/$p/=/ig;
> print "$t $s\n";
> }
> __END__
>
> ergibt:
>
> bb ss
> bU =
> Ub ss
> UU ss
Ah ja, schön eingegrenzt. Dass es sich spezifisch
so verhält, war mir nicht klar.
> Dementsprechend hilft auch ein
>
> utf8::upgrade($s);
>
> in Stefans Programm vor dem Match.
Oder einfach i weglassen.
> Ein Bug ist es IMHO trotzdem.
Ja, das kann man wohl auf jeden Fall feststellen.
GrüÃe
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Peter J. Holzer wrote:
> On 2007-03-26 09:15, Mirco Wahab
>> Verstehe ich nicht. Wenn beide Strings UTF-8 sind,
>> wieso sollte ich dann "Latin-1 oder kompatibles "Ã"
>> voraussetzen?
> Weil Unicode zu Latin-1 in dem Sinn kompatibel ist, dass ein "Ã" (LATIN
> CAPITAL LETTER A WITH TILDE) den Code 0xC3 hat (das gleiche gilt auch
> für diverse andere Latin-x Varianten, z.B. Latin-9 (ISO-8859-1). Wenn Du
> hingegen ISO-8859-7 verwendest, dann ist \x{C3} ein großes Gamma.
>
> Du musst in Perl zwischen "Character-Strings, die intern in UTF8
> gespeichert sind" und "Byte-Strings, die einen UTF-8 kodierten Text
> enthalten" unterscheiden. Das ist nicht das gleiche!
Aha, ich sehe. Sieht so aus, als müsste ich mich
eine erstmal Weile ernsthaft mit den Kodierungen
in Perl und an sich befassen.
Danke (auch an Frank),
Mirco
Post removed (X-No-Archive: yes)