提问
您好,我正在开发韩国的Android应用程序.
在这里,我实现了一个带有字母部分标题的列表视图,以显示联系人.我使用String类的substring方法获取第一个字母作为节标题.对于韩国人,我也使用子字符串方法获取首字母.在这里,我需要将韩语首字母显示为Korean contactㄷㄹㅎㅎㅎㅍㅎ.我真的不知道韩国联系人列表中的哪个首字母与这些韩国首字母匹配.
因此,请帮助我如何做到这一点,或给我参考以遵循…
提前致谢..
最佳答案
我认为在韩国应用程序中,仅凭一个初始字符就具有智能感知是不正常的行为-似乎通常是使用完整的Jamo来完成的.但是,我认为您不应该这样做-没有任何理由-让我们这样做.
首先,您错过了双缩写.这些与单打不同,因为它们确实需要不同的按键(通常是换字符).无论如何,您的姓名缩写列表应为:
ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ
输入首字母缩写时,您需要做的第一件事是获取以该特定首字母开头的字符范围.
通过查看Windows字符映射,我可以看到第一个字母Ka(가)位于Unicode点0xAC00(或十进制,44032),因此,要获取任何范围,都必须将此值添加到任何计算中做.因此,您应该有一个名为FirstLetter的常数或任何常数,其值应为44032.
까位于0xAE4C(或十进制44620),因此我们现在有了一个乘数(即以任何特定首字母开头的字符数-所有首字母均相同,因此为44620-44032即588.
现在,我们有足够的信息来实施您的智能感知.如果您在数组中具有首字母缩写,则可以使用该数组中键入字符的索引来查找以其开头的字符范围.
因此,如果我们以start开头,显然我们希望将所有内容从가返回到깋.全部588.所以ㄱ给我们一个“ 0”,所以我们有
startCodePoint = index * 588 + 44032
// = 0 * 588 + 44032 == 44032 == 가
endCodePoint = (index + 1) * 588 + 44032
// this will include 까
然后您可以通过检查以下内容来检查特定字符是否以“ㄱ”开头
if(charcode >= startCodePoint && charcode < endCodePoint) { ... }
其中charcode是您的智能感知列表中某个项目的第一个字符.
使用类似的方法来找出如何检查字符是否以“가”开头.一切都是按Unicode顺序进行的,因此这是一个非常简单的任务.
要获取任何字符的首字母,可以反向使用上述公式.
即
>获取第一个字符的unicode值(例如각)
>从该值中减去44032.
>将该值除以588.
>使用该值作为索引,以从缩写列表中检索初始字符.
例如
String initials = "ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ";
int value = character.codePointAt(0);
value = (value - 44032) / 588;
String initial = initials.substring(value, 1);