ele*_*pes 12 java sorting character collation chinese-locale
我正在尝试使用Locale.SIMPLIFIED_CHINESE来订购中文国家列表,这似乎是它使用拼音(拼音字母表,即根据他们的拉丁语对应组合从A到Z排序的字符).
但是我发现了一些订单不好的情况.例如:
正确的顺序应该是梵<中,而是以其他方式订购.
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规则.
此外,<口<口<口<口<口之后的所有字符都是不常见的汉字.所以,梵是一个比中国更不常见的角色,所以它放在<口<口<口<口<口之后.
我想知道为什么这个决定,如果它是故意的.但它会导致错误的排序.我不知道如何找到解决方案.
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());\nRun Code Online (Sandbox Code Playgroud)\n\n输出
\n\nBefore 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)]\nRun 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)]\nRun Code Online (Sandbox Code Playgroud)\n\nICU4J 代码片段
\n\nimport com.ibm.icu.text.Collator;\nimport com.ibm.icu.text.RuleBasedCollator\n...\nLocale locale = new Locale("zh", "", "PINYIN");\nCollator collator = (RuleBasedCollator) Collator.getInstance(locale);\nRun Code Online (Sandbox Code Playgroud)\n