使用perl比较两个Unicode字符串

时间:2012-03-05 21:23:37

标签: perl unicode

当我运行以下代码时,它不会进入“在这里做某事”部分:

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

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

是否有另一种方法可以将Unicode字符串与perl进行比较?

1 个答案:

答案 0 :(得分:13)

如果您有两个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");
}

这完全没问题。 eqne会按代码点比较字符串代码点。

某些字形(例如“é”)可以通过多种不同的方式构建,因此您可能必须先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");
}

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