【问题标题】:Collator doesn't sort right for given LocaleCollat​​or 对给定的语言环境排序不正确
【发布时间】:2011-05-12 15:36:15
【问题描述】:

这是语言环境的字母顺序:wikipedia
这是我的代码:

public static void main(String[] args) {
    Locale loc = new Locale("sr","RS");

    Collator col = Collator.getInstance(loc);
    col.setStrength(Collator.SECONDARY);

    List<String> slova = new ArrayList<String>();

    slova.add("Austrija");
    slova.add("Slovačka");
    slova.add("Č");
    slova.add("Đ");
    slova.add("C");
    slova.add("Grčka");
    slova.add("Slovenija");
    slova.add("Španija");
    slova.add("Švajcarska");
    slova.add("Švedska");
    slova.add("Srbija");

    Collections.sort(slova,col);

    for(String s: slova)
        System.out.println(s);
}

这是输出:

奥地利
C
Č
格奇卡
斯洛伐克
斯洛文尼亚
什帕尼亚
斯比亚
斯瓦伊卡尔斯卡
斯韦德斯卡
Đ

从上面的链接可以看出,这不是正确的顺序。
我做错了什么?

【问题讨论】:

  • 以 S 和 Š 开头的单词混合在一起,Đ 不应该在末尾。
  • 假设每个人都能看到输出错误是非常夸张的。
  • 这就是为什么我在顶部添加了带有字母顺序的链接,并添加了指出输出问题的注释。

标签: java sorting internationalization collation


【解决方案1】:

正如我在您的wikipedia 页面和@Vash 他的ISO 链接上找到的。我想你的意思是“sr”塞尔维亚?然后你必须选择“cs”作为国家。

编辑:这取决于您使用的 java 版本。 Java 6 使用新的iso 标准。

【讨论】:

  • Vash 的链接指向过时的 iso 代码。我检查了支持的语言环境,并且 Collat​​or 确实支持 sr_RS 以及旧版 sr_CS。使用 sr_CS 返回相同的输出。
  • ISO-3166 根据定义不能过时。该链接来自 Java 文档。
【解决方案2】:

我认为问题可能是ISO-3166 中没有代码为 RS 的国家/地区

【讨论】:

【解决方案3】:

如果您想要的排序顺序不可用,您可以使用 RuleBasedCollator。不要被这个类的文档吓到。这很简单:

String rules = "< a < b < c < ç < d ...";
RuleBasedCollator myRuleBased = new RuleBasedCollator(rules);
Collections.sort(myList, myRuleBased);

【讨论】:

  • 嗯,它并不能完全解决我的问题,因为我需要根据大量动态获取的语言环境进行排序,这意味着我必须定义一个包含 40 多种不同语言的规则.就算我愿意写出这样的怪物,维持它也将是更可怕的噩梦。我选择用类似的语言环境替换“sr”。
【解决方案4】:

刚刚发现这是一个由政治和语言环境引起的已知问题。感谢您的帮助。

【讨论】:

  • 对此我不太确定。各种版本的 Unicode 标准 (unicode.org) 捕获了排序规则。当前的标准版本 (6.0) 可能对塞尔维亚有正确的排序规则,但 Java 实现了一些以前的快照。请看一下ICU的实现:icu-project.org/apiref/icu4j/com/ibm/icu/text/Collator.html,看看它是否排序正确。
猜你喜欢
  • 2018-02-17
  • 1970-01-01
  • 2022-11-13
  • 1970-01-01
  • 2019-12-07
  • 2018-08-10
  • 2019-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多