【问题标题】: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 下?你可能在想æ?

标签: java android string unicode text-formatting


【解决方案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 因为它确实取决于当前用户的区域设置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
  • 2021-02-05
  • 2020-10-08
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
相关资源
最近更新 更多