Сравнение двух строк Unicode с Perl - PullRequest
4 голосов
/ 06 марта 2012

Когда я запускаю следующий код, он не входит в раздел «сделать что-то здесь»:

my $a ='µ╫P[┐╬♣3▀═<+·1╪מ└╖"ª';
my $b ='µ╫P[┐╬♣3▀═<+·1╪מ└╖"ª';

if ($a ne $b) {
    # do something here    
}

Есть ли другой способ сравнить строки Unicode с perl?

1 Ответ

13 голосов
/ 06 марта 2012

Если у вас есть две строки Unicode (то есть строка кодовых точек Unicode), то вы наверняка сохранили свой файл как UTF-8, и у вас действительно было

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

И это прекрасно работает. eq и ne будут сравнивать кодовую строку строк по кодовой точке.

Некоторые графемы (например, "& eacute;") могут быть построены несколькими различными способами, поэтому вам, возможно, придется нормализовать их представление в первую очередь.

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

Наконец, Unicode считает некоторые символы почти эквивалентными, и их можно считать равными, используя другую форму нормализации.

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");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...