Si vous avez deux chaînes Unicode (à savoir la chaîne de points de code Unicode), alors vous avez sûrement enregistré votre fichier en UTF-8 et que vous aviez en fait
use utf8; # Tell Perl source code is UTF-8.
my $a = 'µ╫P[┐╬♣3▀═<+·1╪מ└╖"ª';
my $b = 'µ╫P[┐╬♣3▀═<+·1╪מ└╖"ª';
if ($a eq $b) {
print("They're equal.\n");
} else {
print("They're not equal.\n");
}
Et cela fonctionne parfaitement bien. eq
et ne
va comparer le code de chaînes point par point de code.
Certains graphèmes (par exemple "& eacute;") peuvent être construits de différentes manières, vous devrez donc d'abord représenter leur normalize.
use utf8; # Tell Perl source code is UTF-8.
use charnames qw(:full); # For \N{}
use Unicode::Normalize qw(NFC);
my $a = NFC("\N{LATIN SMALL LETTER E WITH ACUTE}");
my $b = NFC("e\N{COMBINING ACUTE ACCENT}");
if ($a eq $b) {
print("They're equal.\n");
} else {
print("They're not equal.\n");
}
Enfin, Unicode considère certains caractères presque équivalent, et ils peuvent être considérés comme égaux en utilisant une forme différente de la normalisation.
use utf8; # Tell Perl source code is UTF-8.
use charnames qw(:full); # For \N{}
use Unicode::Normalize qw(NFKC);
my $a = NFKC("2");
my $b = NFKC("\N{SUPERSCRIPT TWO}");
if ($a eq $b) {
print("They're equal.\n");
} else {
print("They're not equal.\n");
}
Pourquoi auriez-vous besoin d'un autre moyen? Y at-il quelque chose que vous recherchez que les comparaisons de chaînes intégrées ('eq',' ne', 'gt',' lt', 'ge', et' le') ne fournissent pas? –
Si les chaînes sont égales (comme elles semblent l'être) alors je m'attendrais à ce que le bloc do do here ne soit pas entré. –
Pour Perl de voir le fichier comme vous le faites, il doit être encodé en UTF-8 et vous devez utiliser 'utf8 use 'En supposant que vous avez fait cela, Perl fera un point de code par comparaison de code de la chaîne . Quels problèmes avez-vous? Avez-vous besoin de [normaliser] (http://search.cpan.org/perldoc?Unicode::Normalize) d'abord? – ikegami