Android 如何获取当前区域设置';s字母表? 背景

Android 如何获取当前区域设置';s字母表? 背景,android,unicode,localization,locale,Android,Unicode,Localization,Locale,今天我注意到,在上,如果您同时拥有英语和希伯来语联系人,并且您切换到英语地区作为主要联系人,那么第一个联系人是英语: 但是,如果您切换到希伯莱语言环境作为主要语言环境,则第一个联系人使用希伯莱语: 问题 我不知道使用哪些函数来实现这一点。我试图在互联网上搜索这种行为以及它是如何发生的,但找不到 比较字符的值总是会返回相同的结果,因此这里的顺序应该更动态 我发现了什么 我想这会帮助我: val unicodeLocaleKeys = Locale.getDefault().unicodeLoc

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

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

问题 我不知道使用哪些函数来实现这一点。我试图在互联网上搜索这种行为以及它是如何发生的,但找不到

比较字符的值总是会返回相同的结果,因此这里的顺序应该更动态

我发现了什么 我想这会帮助我:

val unicodeLocaleKeys = Locale.getDefault().unicodeLocaleKeys
但它总是返回一个空集

我还在诸如Character、Unicode*和String之类的类中搜索这样的函数。我认为那里不存在

问题 Google Contacts应用程序如何按当前地区对联系人进行排序

是否可能获取特定区域设置使用的整个字符集


也许可以比较字符,同时给出区域设置的优先级顺序(用户可以选择多个区域设置)?

也许你看错了

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

最终,您可以从Unicode获得脚本名称(和方向)。你可能会在一些地方得到字母表(例如维基百科)。对于汉语和其他丰富的字母表来说,它将失败。问题是:“字母表”是特定于语言的。在某些欧洲国家,您可能有(某些)重音字符,或将字符组解释为单个字符(也在电话簿上)

所以,如果你想让事情变得简单:

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

  • 相同,但删除重音,并尝试查找字母是否按字母顺序具有相同的优先级:在本例中:忽略重音,否则:保留重音,请参见。可能对两个字母执行相同的操作,例如,在过去

  • 找到一个能够处理如此复杂案例的库(并且它会定期更新)。这可能有助于中文和其他具有大量字符的语言


编辑:简而言之,与使用str1.compareTo(str2)对字符串进行常规排序不同,您应该使用:

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

为什么你认为它以不同的方式工作?是什么线索让你这么想的?你说的“整理”是什么意思?我所能说的是,从用户的角度来看,这就是我所看到的:更改区域设置将更改联系人的顺序。英语是a-z(大写),希伯来语是א-ת(和特殊字符)。你说这是偶然的吗?如果我使用另一种语言,我不会看到这种行为?我不明白:(“排序规则”是区域设置定义的一部分:字母排序(其他部分:数字表示法、货币表示法、字符集、日期表示法和其他两部分IIRC)。更改区域设置时,您会得到不同的排序。检查(顺便说一句,哪一部分提供主排序,哪一部分是您的外观[A,A,A的权重与主权重相同],因此我的第二点会更容易。)--另请参见我的测试。似乎你是正确的,下一个代码在使用英语区域设置时与使用希伯来语区域设置时产生不同的结果:
Collator.getInstance().compare(“א”,“A”)
。因此,可能这就是这个应用程序上使用的内容。我询问了“collation”是因为我不知道它的意思,翻译成我的语言(希伯来语),它就像“collation”一样,说的不多。不管怎么说,但是有可能获得一个地区的所有字符吗?问题是,在每种语言中,你都有很多字符,而不仅仅是“字母表”“,你可能应该对外来名称进行排序。你的问题是真实的,但我从未想过,我也不记得以前见过这样的问题。其中有一些信息,因此应该有一个函数来获取你要查找的内容。[我认为安卓和Java都还没有使用Unicode语言环境进行语言环境定义]