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

时间:2014-08-22 13:20:16

标签: java android string unicode text-formatting

在Android联系人应用程序(或人员应用程序)中,会在联系人姓名之前显示一个部分。 e.g。


A1
 A2


B1
 B2

这里A和B(以粗体显示)是部分。和a1,a2,b1,b2是联系人姓名。他们如何获得部分角色?对于上面的例子,它很简单,因为您可以在java代码中使用“a1”.chatAt(0)提取第一个字符,然后将其大写。但请考虑以下示例:


一个
 œ


B1
 B2
在此示例中,如果您尝试使用“œ”.charAt(0)在java中提取第一个char,它将返回“ - ”而不是“a”。我怎样才能知道'a'是这个的基本特征? 请注意,我希望支持所有语言,并且这些语言也会出现类似问题。有人可以告诉解决方案适用于所有语言。

1 个答案:

答案 0 :(得分:1)

没有不依赖于语言的方法。

考虑姓氏Ölerman

  • 英文版,您希望将其置于 O 之下,OldschoolOmsky之间

  • 在德语中,您希望将其置于 O 之下,OdermanOffspring之间

  • 用瑞典语,你想把它放在Ö下,在字母表的最后,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;
    }
}

不要忘记使用相同的整理器对每个字母下的“第一个字母”和名称进行排序。