Я пытаюсь упорядочить список стран на китайском языке, используя Locale.SIMPLIFIED_CHINESE, который, кажется, упорядочивает с использованием пиньинь (фонетический алфавит, то есть символы упорядочены в соответствии с их латинской соответствующей комбинацией, от A до Z).
Но я нашел несколько случаев, когда это заказы плохо. Например:
- Символ '中' - Чжун1
- Символ '梵' - фанат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());
Результаты этого фрагмента:
Before sorting...
[梵, 中]
After sorting...
[中, 梵]
Копнув глубже, я обнаружил правила, которые Java применяет с Locale.SIMPLIFIED_CHINESE. Вы можете найти на следующем изображении: https://postimg.cc/image/4t915a7gp/full/ (Обратите внимание, что 梵 стоит после 中)
Я понял, что перед ‹口‹口‹口‹口‹口, который я выделил красным, все символы упорядочены в соответствии с соответствующей им латинской комбинацией, от A до Z. Однако после ‹口‹口‹口‹口‹口 знак, символы упорядочены по составу персонажа. Например, если все символы имеют одинаковую часть (обычно левая часть символа), они группируются вместе, а не по правилу от А до Я.
Кроме того, все символы после ‹口‹口‹口‹口‹口 являются менее распространенными китайскими иероглифами. Таким образом, 梵 является менее распространенным символом, чем 中, поэтому он ставится после ‹口‹口‹口‹口‹口.
Интересно, почему это решение, если это намеренно. Но это приводит к неправильной сортировке. Я не знаю, как найти решение для этого.