3

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

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

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

提前致谢..

4

2 回答 2

5

我不认为在韩国应用程序中仅从初始字符获得智能感知是不正常的行为——它似乎通常是用完整的 Jamo 完成的。但是,我认为您没有理由不这样做 - 所以让我们这样做吧。

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

ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ

输入首字母时,您需要做的第一件事是获取以该特定首字母开头的字符范围。

通过查看 Windows 字符映射表,我可以看到第一个字母 Ka (가) 在 Unicode 点0xAC00(或小数点44032)处,因此要获得任何范围,必须将这个值添加到我们所做的任何计算中。所以你应该有一个叫FirstLetter什么的常量,它的值应该是44032.

까 是 at 0xAE4C(或 decimal 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) { ... }

charcodeintellisense 列表中一个项目的第一个字符在哪里。

使用类似的方法来找出如何检查字符是否以say '가' 开头。Unicode 中的一切都井井有条,因此这是一项非常简单的任务。


要获取任何字符的首字母,可以反向使用上述公式。

IE

  1. 获取第一个字符的unicode值(例如각)
  2. 从此值中减去 44032。
  3. 将此值除以 588。
  4. 使用该值作为索引从首字母列表中检索首字母。

例如

String initials = "ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ";
int value = character.codePointAt(0);
value = (value - 44032) / 588;
String initial = initials.substring(value, 1);
于 2012-05-08T09:41:07.813 回答
0

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

int codePoint = strng.codePointAt(0);
int indexToRest = Character.charCount(codePoint); // For your information
于 2012-05-08T09:17:52.627 回答