4

在比较字符串时,维护在 Perl 和 Java 中提供相同排序规则的函数的最佳方法是什么?这是 Perl 中的示例函数:

sub compare_strs
{
    my ( $str1, $str2 ) = @_;
    # Treat vars as strings by quoting. 
    # Possibly incorrect/irrelevant approach. 
    return ("$str1" cmp "$str2");
}

这里的担忧是:

  • 字符串可以包含中文/日文字符。不能依赖上面的 Perl 代码来给出预期的结果。
  • 如何保证 Perl 和 Java 实现都可以以相同的方式执行字符串排序规则?

  • 4

    1 回答 1

    4

    对于 Perl,不要使用cmp运算符。相反,您应该使用该Unicode::Collate模块:

    use Unicode::Collate;
    sub compare_strs
    {
        my ( $str1, $str2 ) = @_;
        # Treat vars as strings by quoting. 
        # Possibly incorrect/irrelevant approach. 
        return $Collator->cmp("$str1", "$str2");
    }
    

    如果您担心规范化(例如,组合标记的顺序),您也可以使用该Unicode::Normalize模块。

    在 Java 中,使用Collator类,如有关比较字符串的教程中所述。有关规范化,请参阅规范化文本教程。Java 1.6 中引入了所需的类;如果您需要支持早期版本的 Java,则需要使用ICU 库之类的东西。

    使用如上所述的适当工具应确保两种环境的行为都符合Unicode 排序算法(因此彼此兼容)。

    于 2013-07-26T20:42:05.367 回答