如何获取以派生字符开头的名称的节字符

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下,OldschoolOmsky之间

在德语中,你想把它放在 O 下,在 OdermanOffspring 之间

在瑞典语中,您想将其放在 Ö 下,在字母表的最后,在 XYZÅÄ

之后

在土耳其语中,您想将其放在 Ö 下,介于 OP

之间

所以你需要为用户的语言选择一个合适的排序算法。

至于获取“首字母”,我认为这可能是一个好的开始:

// 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 for userLocale 因为它确实取决于当前用户的区域设置。

以上是关于如何获取以派生字符开头的名称的节字符的主要内容,如果未能解决你的问题,请参考以下文章

如何从 ISO 8061 字符串日期时间派生以获取 Python3 中的时区名称? [复制]

如何仅获取以“1”开头的文件中的第一行。后跟除数字以外的任何字符?

WCF 服务参考 - 在客户端获取“XmlException:名称不能以 '<' 字符开头,十六进制值 0x3C”

获取以某些字母开头的名称列表[关闭]

如何获取以常用词开头的所有 Windows 服务名称?

如何选择仅以特定前缀开头的字符串