按字母顺序排列的中文 - java.text.Collat​​or

时间:2012-11-08 09:04:32

标签: java internationalization locale chinese-locale

我一直在用中文测试字母排序(如果我可以这么称呼的话)。这是Excel对一些示例单词进行排序的方法:

  

啊<波<词<的<俄<佛<歌<和<及<课<了<馍<呢<票<气<日&LT ;四<特<瓦<喜<以及LT;只

     

0< 2< 85<<<版本<标记<成员<错误<导出<导航< Excel文件<访问<分类<更改<规则< HTML&lt ;基本<记录<可选<快捷方式<类别<历史记录<密码<目录<内联<内容<讨论<文件<页面<只读

这是Collections.sort(list, simplified_chinese_collator_comparator)(第一个以粗体显示的冒犯字符)的结果:

  

啊<波<词<的<俄<佛<歌<和<及<课<了<呢<票<气<日<四&LT ;特<瓦<喜<以及LT;只<的

     

!< @< 0< 0< 0< 0<< 2<<         <<  <<

我对中文一无所知。有谁知道为什么Collator输出它不同,或者基于什么?

是否还有其他基于语言的排序库?

2 个答案:

答案 0 :(得分:3)

Java 6或7中没有Collat​​or,它将按照与第一个样本相同的顺序对中文进行排序。

public static void main(String... args) {
    String text1 = "啊<波<词<的<俄<佛<歌<和<及<课<了<馍<呢<票<气<日<四<特<瓦<喜<以<只";
    findLocaleForSortedOrder(text1);
    String text2 = "啊<波<词<的<俄<佛<歌<和<及<课<了<呢<票<气<日<四<特<瓦<喜<以<只<馍";
    findLocaleForSortedOrder(text2);
}

private static void findLocaleForSortedOrder(String text) {
    System.out.println("For " + text + " found...");
    String[] preSorted = text.split("<");
    for (Locale locale : Collator.getAvailableLocales()) {
        String[] sorted = preSorted.clone();
        Arrays.sort(sorted, Collator.getInstance(locale));
        if (Arrays.equals(preSorted, sorted))
            System.out.println("Locale " + locale + " has the same sorted order");
    }
    System.out.println();
}

打印

For 啊<波<词<的<俄<佛<歌<和<及<课<了<馍<呢<票<气<日<四<特<瓦<喜<以<只 found...

For 啊<波<词<的<俄<佛<歌<和<及<课<了<呢<票<气<日<四<特<瓦<喜<以<只<馍 found...
Locale zh_CN has the same sorted order
Locale zh has the same sorted order
Locale zh_SG has the same sorted order

答案 1 :(得分:3)

为何与众不同?因为有几种不同的方法可以排序表意字符甚至整个单词。困在我脑海中的是:

  • 按行程数
  • 使用拉丁音译然后“自然地”命名(当然根据中文特定的规则)

还有其他方法,例如Unicode Technical Report #35提到其中一些(更多是巧合,没有必要),但你必须有足够的时间来完成它。

为了回答你的问题,为什么这些排序顺序不同,这只是因为Java包含自己的排序规则而且它不依赖于操作系统的排序规则(就像Excel那样)。这些规则可能有所不同。您可能还想尝试ICU,这是Java中类和规则的来源(通常比JDK领先一步)。