Как получить алфавит текущей локали? - PullRequest
0 голосов
/ 14 января 2020

Фон

Сегодня я заметил, что в приложении Google Contacts , если у вас есть контакты Engli sh и иврит, и вы переключаетесь на язык Engli sh в качестве главный, первые контакты в Engli sh:

enter image description here

Но, если вы переключитесь на иврит в качестве основного, первые контакты на иврите:

enter image description here

Проблема

Я не вижу, какие функции используются для этого. Я пытался найти в Inte rnet об этом поведении и о том, как это делается, но не смог его найти.

Сравнение значений символов всегда будет возвращать один и тот же результат, поэтому порядок здесь должен быть более Dynami c.

То, что я нашел

Я думал, что это поможет мне:

val unicodeLocaleKeys = Locale.getDefault().unicodeLocaleKeys

Но он всегда возвращает пустой набор.

Я также искал такую ​​функцию в таких классах, как Character, Unicode * и String. Я не думаю, что он там существует.

Вопрос

Как приложение Google Contacts может сортировать контакты по текущим языковым настройкам?

Возможно ли получить весь набор символов, используемый заданной c локалью?

Может быть, возможно сравнивать символы, задавая порядок приоритетов локалей (пользователи могут выбирать несколько локалей)?

1 Ответ

0 голосов
/ 14 января 2020

Возможно, вы ищете не то, что нужно.

Кажется, что в приложении для контактов нет встроенного алфавита (для каждой локали), а просто сопоставление (локальная сортировка) и отображение первого символа. Возможно, он найдет «символы» (категории Unicode) и поместит все символы в один и тот же bin .

В конечном итоге вы можете получить из Unicode имя сценария (и направление). Вы можете получить алфавит в нескольких местах (например, в Википедии). Это не удастся китайцам и другим богатым алфавитам . Проблема: «алфавит» - это язык, определенный c. В некоторых европейских странах у вас могут быть (некоторые) акцентированные символы или группы символов, интерпретируемые как один символ (также в телефонных книгах).

Итак, если вы хотите, чтобы все было просто:

  • используйте сопоставление и только первый символ

  • то же самое, но удалите ударение и попытайтесь определить, имеет ли буква одинаковый приоритет в алфавитном порядке c: в этом case: игнорировать акцент, остальное: сохранить, см. например Å - место в алфавите . Возможно, сделайте то же самое с двумя буквами, например, ll в прошлом.

  • найдите библиотеку, которая обрабатывает такие сложные случаи (и что она будет регулярно обновляться). Это поможет, вероятно, для китайского и других языков с большим количеством символов.


РЕДАКТИРОВАТЬ: короче, вместо обычной сортировки строк с использованием str1.compareTo(str2), вы должны использовать:

Collator.getInstance().compare(str1,str2)
...