使用Locale.SIMPLIFIED_CHINESE使用Collat​​or进行错误的排序

ele*_*pes 12 java sorting character collation chinese-locale

我正在尝试使用Locale.SIMPLIFIED_CHINESE来订购中文国家列表,这似乎是它使用拼音(拼音字母表,即根据他们的拉丁语对应组合从A到Z排序的字符).

但是我发现了一些订单不好的情况.例如:

  • '中'字符是zhong1
  • '梵'的角色是粉丝4

正确的顺序应该是梵<中,而是以其他方式订购.

String[] characters = new String[] {"?", "?"};
List<String> list = Arrays.asList(characters);
System.out.println("Before sorting...");
System.out.println(list.toString());

Collator collator = Collator.getInstance(Locale.SIMPLIFIED_CHINESE);
collator.setStrength(Collator.PRIMARY);
Collections.sort(list, collator);

System.out.println("After sorting...");
System.out.println(list.toString());
Run Code Online (Sandbox Code Playgroud)

这个片段的结果是:

Before sorting...
[?, ?]
After sorting...
[?, ?]
Run Code Online (Sandbox Code Playgroud)

更进一步,我发现Java适用于Locale.SIMPLIFIED_CHINESE的规则.您可以在下一张图片中找到: https://postimg.cc/image/4t915a7gp/full/(注意梵在中后)

我在用红色突出显示的<口<口<口<口之前意识到,所有字符都根据他们的拉丁记者组合从A到Z排序.但是,在<口<口<口<口<口之后符号,字符按字符的组成排序.例如,如果所有字符都具有相同的部分(通常是字符的左侧部分),则它们将组合在一起,而不是根据A到Z规则.

此外,<口<口<口<口<口之后的所有字符都是不常见的汉字.所以,梵是一个比中国更不常见的角色,所以它放在<口<口<口<口<口之后.

我想知道为什么这个决定,如果它是故意的.但它会导致错误的排序.我不知道如何找到解决方案.

Sub*_*mal 2

Java 中的排序器提供的排序顺序基于书写该字符所需的笔画。

\n\n

请参阅下面的小片段进行演示。笔画数取自维基百科

\n\n
// the unicode character and the number of strokes\nString[] characters = new String[]{\n    "\\u68B5 (11)", "\\u4E2D (4)", \n    "\\u5207 (4)", "\\u5973 (3)", "\\u898B (7)"\n};\nList<String> list = Arrays.asList(characters);\nSystem.out.println("Before sorting...");\nSystem.out.println(list.toString());\n\nCollator collator = Collator.getInstance(Locale.TRADITIONAL_CHINESE);\ncollator.setStrength(Collator.PRIMARY);\nSystem.out.println();\nCollections.sort(list, collator);\n\nSystem.out.println("After sorting...");\nSystem.out.println(list.toString());\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出

\n\n
Before sorting...\n[\xe6\xa2\xb5 (11), \xe4\xb8\xad (4), \xe5\x88\x87 (4), \xe5\xa5\xb3 (3), \xe8\xa6\x8b (7)]\n\nAfter sorting...\n[\xe5\xa5\xb3 (3), \xe4\xb8\xad (4), \xe5\x88\x87 (4), \xe8\xa6\x8b (7), \xe6\xa2\xb5 (11)]\n
Run Code Online (Sandbox Code Playgroud)\n\n

有一个增强请求JDK-6415666来实现根据 Unicode 排序规则的排序顺序。但根据有关Java 8 支持的语言环境的信息,它并未在 Java 8 中实现。

\n\n

编辑使用icu4j中的整理器的排序顺序是

\n\n
[\xe6\xa2\xb5 (11), \xe8\xa6\x8b (7), \xe5\xa5\xb3 (3), \xe5\x88\x87 (4), \xe4\xb8\xad (4)]\n
Run Code Online (Sandbox Code Playgroud)\n\n

ICU4J 代码片段

\n\n
import com.ibm.icu.text.Collator;\nimport com.ibm.icu.text.RuleBasedCollator\n...\nLocale locale = new Locale("zh", "", "PINYIN");\nCollator collator = (RuleBasedCollator) Collator.getInstance(locale);\n
Run Code Online (Sandbox Code Playgroud)\n