2017-03-20 3 views
2

Ich habe ein sehr seltsames Problem mit der Umwandlung von zwei "identischen" Strings in Großbuchstaben. Das Programm liest Zeilen von einer Website und vergleicht sie mit Zeilen, die in einer Textdatei gespeichert sind. Wenn die Zeile nicht gefunden wird, wird sie am Ende der Datei hinzugefügt. Dies funktioniert einwandfrei, wenn die Zeile keine Sonderzeichen enthält. Aus irgendeinem Grund führt der Vergleich zu einer Nichtübereinstimmung. Ich vergleiche die beiden Strings, indem ich sie zuerst in Großbuchstaben umwandle und das ist der Punkt, an dem es schief geht. Unten ist ein Code. Ich habe den Teil weggelassen, wo die zwei Variablen gefüllt sind. Ich zeige nur den komischen Teil.(Scheinbar) identische Strings in Großbuchstaben unterschiedlich konvertiert

print "$pageLine <-> $dbLine\n"; 
print uc($pageLine) . " <-> " . uc($dbLine) . "\n"; 

Dies führt zu

Diëtisten <-> Diëtisten 
DIëTISTEN <-> DIËTISTEN 

Beachten Sie, dass in der ersten E nicht in Großbuchstaben umgewandelt.

foreach my $kar (split(//, $pageLine)) { 
    print ord($kar) . ":"; 
} 
print "\n"; 
foreach my $kar (split(//, $dbLine)) { 
    print ord($kar) . ":"; 
} 
print "\n"; 

Daraus ergibt sich:

68:105:235:116:105:115:116:101:110:32:40:78:86:68:41: 
68:105:235:116:105:115:116:101:110:32:40:78:86:68:41: 

jemand eine Idee haben, was hier vor sich geht?

Vielen Dank im Voraus.

+2

http://perldoc.perl.org/functions/fc.html könnte auch ein gutes Buch sein. – simbabque

Antwort

6

Minimal Demonstration:

my $s = "\xEB"; 
utf8::downgrade(my $d = $s); 
utf8::upgrade( my $u = $s); 
printf "%vX %vX %s\n", $d, $u, $d eq $u ? "same" : "different"; 
$_ = uc($_) for $d, $u; 
printf "%vX %vX %s\n", $d, $u, $d eq $u ? "same" : "different"; 

Ausgang:

EB EB same 
EB CB different 

standardmäßig für Rückwärtskompatibilität wird uc nur Groß ASCII-Zeichen, wenn die UTF8 Flagge skalare Eingabe ausgeschaltet ist. Es ist eine Instanz der Unicode Bug [1], die durch Zugabe der folgenden Fest ist:

use 5.012; 

Referenzen: indirekt

use feature qw(unicode_strings); 

Die oben durch Zugabe der folgenden getan werden kann unicode_strings, feature, use


  1. Wenn das Verhalten von Code vom Speicherformat einer Zeichenfolge abhängt, leidet dieser Code unter dem Unicode-Fehler.
+0

Das löste das Problem tatsächlich. :) Ist es sicher zu ersetzen "verwenden Sie streng;" mit "Verwendung 5.012;" in all meinen Modulen? – Zippy1970

+1

Ja. "* Wenn die angegebene Perl-Version größer oder gleich 5.12.0 ist, werden Strictures lexikalisch wie bei Verwendung strict * aktiviert." – ikegami

Verwandte Themen