【问题标题】:Unicode Comparison in Perl and JavaPerl 和 Java 中的 Unicode 比较
【发布时间】:2013-07-27 05:46:19
【问题描述】:

在比较字符串时,维护一个在 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 实现都可以以相同的方式执行字符串排序规则?
  • 【问题讨论】:

    • 真的真的很难理解你在这里问什么。请举例说明您的顾虑。
    • 我不确定我是否理解这个问题。您是否在问如何在 Perl 和 Java 中编写对 unicode 字符串进行排序的代码,并保证在 Perl 和 Java 实现中的顺序相同?
    • 你为什么要引用这些变量,顺便说一句?你是什​​么意思可能包含Unicode字符?无论如何,如果你想要相同的排序规则,你应该使用排序规则模块。你不应该做按位等价或顺序:这在 Unicode 中真的没有意义。在 Perl 中使用 Unicode::Collat​​e。
    • 你还没有说出你对“预期结果”的看法,所以很难回答。我向你保证,一旦你的期望正确建立,Perl 就会给出预期的结果。我假设您希望根据 JIS X 0208 对日语进行排序,但是您想要六个中文排序规则中的哪一个,您打算如何混合这些排序规则?请参阅 Unicode::Collat​​e::Locale 模块。
    • @tchrist 预期的结果只是很容易说出一个字符串是否小于另一个字符串,并让它适用于任何类型的字符集。让我对这些模块进行一些研究。

    标签: java perl unicode


    【解决方案1】:

    对于 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 类,如 tutorial on comparing strings 中所述。有关规范化,请参阅tutorial on normalizing text。 Java 1.6 中引入了所需的类;如果您需要支持早期版本的 Java,则需要使用 ICU libraries 之类的东西。

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

    【讨论】:

    • 双引号能给你带来什么?
    • @tchrist - 大多数时候(实际上,几乎所有时间)它什么都没有。但是,在极少数情况下,显式地对变量进行字符串化可能会有所作为。见this thread
    • 我知道它的作用。我想了解您为什么认为它们是个好主意。
    • @tchrist - 如果我是在编码而不是从 OP 的原始问题中复制粘贴,我就不会使用引号。 “你为什么认为他们是个好主意”(我不知道)和 “他们给你买什么” 不是完全相同的问题。 :)
    • @tchrist - 哎呀。我刚刚看了你的资料。不知道我在和谁说话!
    猜你喜欢
    • 2013-11-14
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多