如何获取以派生字符开头的名称的节字符
Posted
技术标签:
【中文标题】如何获取以派生字符开头的名称的节字符【英文标题】:How to get the section character for names which start with a derived character 【发布时间】:2014-08-22 13:20:15 【问题描述】:在 android 联系人应用程序(或 People 应用程序)中,联系人姓名前会显示一个部分。例如
一个
a1 a2
B
b1 b2
这里的 A 和 B(以粗体显示)是部分。 a1, a2, b1, b2 是联系人姓名。他们如何获得部分字符?对于上面的示例,它很简单,因为您可以在 java 代码中使用 "a1".chatAt(0) 提取第一个字符,然后将其大写。但请考虑以下示例:
一个
一个 ——
B
b1 b2 在此示例中,如果您尝试使用“œ”.charAt(0) 提取 java 中的第一个字符,它会返回 'œ' 而不是 'a'。我怎样才能知道'a'是这个的基本字符? 请注意,我希望支持所有语言,并且这些语言也会出现类似的问题。有人能说出适用于所有语言的解决方案吗?
【问题讨论】:
您为什么要在 A 下进行分类,而不是在 O 下?你可能在想æ? 【参考方案1】:没有不依赖于语言的方法。
考虑姓Ölerman
:
英文,你想把它放在O下,Oldschool
和Omsky
之间
在德语中,你想把它放在 O 下,在 Oderman
和 Offspring
之间
在瑞典语中,您想将其放在 Ö 下,在字母表的最后,在 XYZÅÄ
之后在土耳其语中,您想将其放在 Ö 下,介于 O 和 P
之间所以你需要为用户的语言选择一个合适的排序算法。
至于获取“首字母”,我认为这可能是一个好的开始:
// I recommend using ICU4J for collation instead
Collator coll = Collator.getInstance(userLocale);
char result = Character.toUppercase(name.charAt(0));
String key = name.charAt(0) + "a";
for(char c = 'A', c <= 'Z'; c++)
String cs = Character.toString(c);
if(coll.compare(cs, key)<0 && coll.compare(key,cs+"z")<0)
result = c;
break;
不要忘记使用相同的整理器对“第一个字母”和每个字母下的名称进行排序。
【讨论】:
+1 foruserLocale
因为它确实仅取决于当前用户的区域设置。以上是关于如何获取以派生字符开头的名称的节字符的主要内容,如果未能解决你的问题,请参考以下文章
如何从 ISO 8061 字符串日期时间派生以获取 Python3 中的时区名称? [复制]
如何仅获取以“1”开头的文件中的第一行。后跟除数字以外的任何字符?