Perl Unicode 美食菜谱:不区分大小写的比较

℞ 21: Unicode 不区分大小写的比较

Unicode 不仅仅是一个扩展的字符集。Unicode 是一组关于字符行为的规则以及每个字符的一组属性。

比较字符串以确定它们是否等价通常需要将它们归一化到标准形式。这种归一化形式通常要求所有字符都处于特定的格式。℞ 20: Unicode 格式化展示了在 Unicode 中将大小写字符之间转换比简单地映射 [A-Z][a-z] 要复杂得多。(记住,许多字符还有标题格式!)

对于归一化比较的正确解决方案是执行 casefolding 而不是将某些字符的子集映射到另一个。Perl 5.16 添加了一个名为 fc() 或“foldcase”的新功能来执行 Unicode casefolding,就像 /i 模式修饰符一直提供的那样。这个功能可以通过 CPAN 模块 Unicode::CaseFold 在其他 Perls 中使用。

 use feature "fc"; # fc() function is from v5.16
 # OR
 use Unicode::CaseFold;

 # sort case-insensitively
 my @sorted = sort { fc($a) cmp fc($b) } @list;

 # both are true:
 fc("tschüß")  eq fc("TSCHÜSS")
 fc("Σίσυφος") eq fc("ΣΊΣΥΦΟΣ")

正确折叠大小写更详细地介绍了 Perl 中的大小写折叠。

上一页:℞ 20: Unicode 格式化

系列索引:标准序言

下一页:℞ 22: 匹配 Unicode 行断开序列

标签

反馈

这篇文章有什么问题吗?请在 GitHub 上打开一个 issue 或 pull request 来帮助我们。