我认为韩国应用程序中仅从初始字符进行智能感知是不正常的行为 - 似乎通常使用完整的 Jamo 来完成。但是,我认为您没有理由不这样做 - 所以让我们这样做吧。
首先,您错过了双首字母。这些与单曲不同,因为它们确实需要不同的按键(通常是 shift+character)。无论如何,您的姓名缩写列表应该是:
ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ
输入首字母时您需要做的第一件事是获取以该特定首字母开头的字符范围。
通过查看 Windows 字符映射,我可以看到第一个字母 Ka (가) 位于 Unicode 点 0xAC00(或十进制,44032),所以要获得任何范围,这个值将有添加到我们所做的任何计算中。所以你应该有一个名为FirstLetter 的常量,它的值应该是44032。
까在0xAE4C(或十进制44620),所以我们现在有一个乘数(即以任何特定首字母开头的字符数 - 对于所有首字母都是相同的,所以这是44620-44032是588。
我们现在有足够的信息来实施您的智能感知。如果您在数组中有首字母缩写词,我们可以使用该数组中键入字符的索引来查找以它开头的字符范围。
所以如果我们以 ㄱ 开头,我们显然想要返回从 가 到 깋 的所有内容。全部 588 个。所以ㄱ给了我们一个'0',所以我们有
startCodePoint = index * 588 + 44032
// = 0 * 588 + 44032 == 44032 == 가
endCodePoint = (index + 1) * 588 + 44032
// this will include 까
然后您可以通过检查来检查特定字符是否以“ㄱ”开头
if(charcode >= startCodePoint && charcode < endCodePoint) { ... }
其中charcode 是智能感知列表中某个项目的第一个字符。
使用类似的方法来了解如何检查字符是否以say '가' 开头。 Unicode 中的一切都井井有条,所以这是一个非常简单的任务。
要得到任意字符的首字母,可以逆向使用上面的公式。
即
- 获取第一个字符的unicode值(例如각)
- 从此值中减去 44032。
- 将此值除以 588。
- 使用该值作为索引从首字母列表中检索首字母。
例如
String initials = "ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ";
int value = character.codePointAt(0);
value = (value - 44032) / 588;
String initial = initials.substring(value, 1);