【问题标题】:How to convert to Korean initials如何转换成韩文首字母
【发布时间】:2023-03-29 22:45:01
【问题描述】:

您好,我正在开发一款韩国安卓应用。

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

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

提前致谢..

【问题讨论】:

标签: java android cjk


【解决方案1】:

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

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

【讨论】:

  • 对于韩语,这将得到一个完整的音节块,这是一个由最多五个字母组成的预组合字符,称为 jamo。 OP专门询问是否只获得第一个字母/ jamo。这相当于转换为 Unicode normalization form D然后 取第一个字符。
【解决方案2】:

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

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

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

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

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

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

我们现在有足够的信息来实施您的智能感知。如果您在数组中有首字母缩写词,我们可以使用该数组中键入字符的索引来查找以它开头的字符范围。

所以如果我们以 ㄱ 开头,我们显然想要返回从 가 到 깋 的所有内容。全部 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 中的一切都井井有条,所以这是一个非常简单的任务。


要得到任意字符的首字母,可以逆向使用上面的公式。

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

例如

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

【讨论】:

  • 您好文森特,非常感谢您的快速回复。仅供参考我不懂韩语。上面解释的方法对我来说是全新的。我不太理解您所说的“首先,您错过了双首字母。”你说“输入首字母时你需要做的第一件事是获取以该特定首字母开头的字符范围。”和“ Windows Character Map”和“unicode point”。仅供参考,我没有在这里输入任何内容。我正在获取电话联系人姓名并将第一个字母作为列表视图的部分标题。这个答案似乎对我有用,但是
  • 我不明白如何使用它....你能不能给我更多的解释或给我一些参考...
  • 我在这个链接中也看到了同样的解释 dotnetpower.tistory.com/20 ...我不确定我在 Java 中也能做到这一点。
  • 好的,基本上你需要使用我的首字母列表而不是你的首字母列表。
  • 我将用如何获取任何特定字符的首字母来更新我的答案。
猜你喜欢
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 2016-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多