Java 如何转换成韩语首字母

Java 如何转换成韩语首字母,java,android,cjk,Java,Android,Cjk,嗨,我正在开发一款韩国安卓应用程序 在这里,我实现了一个带有字母部分标题的listview来显示联系人。我使用String类的substring方法获取第一个字母作为节头。对于韩语联系人,我也会使用子字符串方法获取第一个字母。在这里,我需要将韩语首字母显示为ㄱ ㄴ ㄷ ㄹ ㅁ ㅂ ㅅ ㅇ ㅈ ㅊ ㅋ ㅌ ㅍ ㅎ 关于韩国联系人的第一封信。我真的不知道韩国联系人名单的第一个字母和这些韩国人的首字母匹配 所以,请帮助我如何做到这一点,或给我参考,以遵循 提前感谢。国际上的方法是获取Unicode i

嗨,我正在开发一款韩国安卓应用程序

在这里,我实现了一个带有字母部分标题的listview来显示联系人。我使用String类的substring方法获取第一个字母作为节头。对于韩语联系人,我也会使用子字符串方法获取第一个字母。在这里,我需要将韩语首字母显示为ㄱ ㄴ ㄷ ㄹ ㅁ ㅂ ㅅ ㅇ ㅈ ㅊ ㅋ ㅌ ㅍ ㅎ 关于韩国联系人的第一封信。我真的不知道韩国联系人名单的第一个字母和这些韩国人的首字母匹配

所以,请帮助我如何做到这一点,或给我参考,以遵循


提前感谢。

国际上的方法是获取Unicode int代码。这通常可能不止一个16位字符

int codePoint = strng.codePointAt(0);
int indexToRest = Character.charCount(codePoint); // For your information

我不认为在韩国的应用程序中,仅仅从一个初始角色就有智能感知是正常的行为——它似乎通常是通过一个完整的Jamo来完成的。然而,我看不出你有什么理由不去做——所以让我们去做吧

首先,你错过了双首字母。这与单打不同,因为它们需要不同的按键(通常是shift+字符)。无论如何,您的姓名首字母列表应为:

ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ
键入首字母时,首先需要获得以该特定首字母开头的字符范围

通过查看Windows字符映射,我可以看到第一个字母Ka(가) 位于Unicode点
0xAC00
(或十进制,
44032
),因此要获得任何范围,必须将此值添加到我们进行的任何计算中。因此,您应该有一个名为
FirstLetter
或其他任何值的常量,其值应为
44032

까 是
0xAE4C
(或十进制
44620
),因此我们现在有了一个乘数(即以任何特定首字母开头的字符数-这对于所有首字母都是相同的,因此是
44620-44032
,即
588

我们现在有足够的信息来实现intellisense。如果数组中有初始值,我们可以使用该数组中键入字符的索引来查找以其开头的字符范围

所以如果我们从ㄱ, 很明显,我们想归还所有的东西가 到깋. 全部588个,所以ㄱ 给我们一个“0”,所以我们有

startCodePoint = index * 588 + 44032
// = 0 * 588 + 44032 == 44032 == 가
endCodePoint = (index + 1) * 588 + 44032
// this will include 까
然后你可以检查一个特定的角色是否以'ㄱ' 通过检查

if(charcode >= startCodePoint && charcode < endCodePoint) { ... }

嗨,Vincent,谢谢somuch的快速回复。仅供参考,我不懂韩语。上面解释的方法对我来说是全新的。我不太理解你说的“首先,你错过了双首字母。”你说的是什么“键入首字母时,您需要做的第一件事是获取以该特定首字母开头的字符范围。”以及“Windows字符映射”和“unicode点”".FYI,我没有在这里输入任何东西。我得到了电话联系人的姓名,并将第一个字母作为listview的部分标题。这个答案似乎对我有用,但我不知道如何使用它…你能给我一些更多的解释或给我一些参考来遵循…我在这个链接中也看到了相同的解释…我我不确定我在Java中也能做到。好的,基本上你需要使用我的首字母列表而不是你的首字母列表。我将更新我的答案,告诉你如何获得任何特定字符的首字母。对于韩语,这将得到一个完整的音节块,这是一个由最多五个字母组成的预合成字符,称为jamo。OP特别是一个字母仅获取第一个字母/jamo。这相当于转换为第一个字符,然后获取第一个字符。有用的writeup:
String initials = "ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ";
int value = character.codePointAt(0);
value = (value - 44032) / 588;
String initial = initials.substring(value, 1);