如何获取当前语言环境的字母表?

How to get the current locale's alphabet?

背景

今天我注意到在 Google's Contacts app 上,如果您同时拥有英语和希伯来语联系人,并且您切换到英语语言环境作为主要语言环境,那么第一个联系人是英语:

但是,如果您切换到希伯来语作为主要语言环境,则第一个联系人是希伯来语:

问题

我没有看到哪些函数用于执行此操作。我试图在 Internet 上搜索有关此行为及其实现方式的信息,但找不到。

比较字符的值总是return相同的结果,所以这里的顺序应该更动态。

我发现了什么

我认为这对我有帮助:

val unicodeLocaleKeys = Locale.getDefault().unicodeLocaleKeys

但它总是 return 是一个空集。

我也在Character、Unicode*、String等类中搜索过这样的函数。我认为那里不存在。

问题

Google 通讯录应用程序如何按当前语言环境对联系人进行排序?

是否有可能获取特定语言环境使用的整套字符?

也许可以比较字符,同时给出语言环境的优先顺序(用户可以选择多个语言环境)?

也许你看错了。

联系人应用程序似乎没有内置字母表(每个区域设置),而只是一个排序规则(本地排序)并显示第一个字符。可能它会找到 "symbols"(Unicode 类别)并将所有符号放在同一个 bin.

最终您可以从 Unicode 中获取脚本名称(和方向)。您可能会在少数地方获得字母表(例如维基百科)。对于中文和其他丰富的字母,它将失败。问题:"alphabet" 是特定于语言的。在某些欧洲国家/地区,您可能有(某些)重音字符,或解释为单个字符的字符组(phone 书籍中也有)。

因此,如果您想保持简单:

  • 使用排序规则并只使用第一个字符

  • 相同,但删除重音,并尝试查找字母是否按字母顺序具有相同的优先级:在这种情况下:忽略重音,否则:保留它,参见例如Å - place in alphabet. Maybe do the same with two letters, e.g. ll过去。

  • 找到一个可以处理这种复杂情况的库(并且它会定期更新)。这可能对中文和其他有大量字符的语言有帮助。


编辑:简而言之,您应该使用

而不是使用 str1.compareTo(str2) 对字符串进行正常排序
Collator.getInstance().compare(str1,str2)