在java中获取韩语单词的最后一个字符

shi*_*ife 1 java string

我正在尝试获取韩语单词 (a String)的最后一个字符,但它没有按计划工作。如果我有字符串:"??",我想得到 ,"?"但我得到了"?"

我已经尝试过的:

word.charAt(word.length-1); // gets ?
Run Code Online (Sandbox Code Playgroud)

我还检查了是否"??""?"using结尾word.endsWith("?"),但它返回 false。

如果我问,它会给出真实的回报,word.endsWith("?")

Dan*_*son 6

此答案使用来自如何转换为韩语首字母韩语写作系统的信息。正如后者所描述的,韩文分为(可能的)三个部分:首字母、元音和尾辅音(如果存在)。尾辅音可能由 2 个辅音组成,如?
恕我直言,unicode 编码设计得非常出色,因此可以使用公式对韩文字符编码进行编码/解码,如(韩国书写系统)所述:

tail = mod ($hangulCodepoint ? 44032, 28) 
vowel = 1 + mod ($hangulCodepoint ? 44032 ? tail, 588) / 28 
lead = 1 + int [ ($hangulCodepoint ? 44032) / 588 ]
Run Code Online (Sandbox Code Playgroud)

由于我需要与您描述的相同的东西,因此我实现了以下内容:

private final static String getCharacter(final String character) {
    // the following characters are in the correct (i.e. Unicode) order
    final String initials = "???????????????????";// list of initials
    final String vowels = "?????????????????????";// list of vowels
    final String finals = "???????????????????????????";// list of tail characters
    final int characterValue = character.codePointAt(0); // Unicode value
    final int hangulUnicodeStartValue = 44032;
    if (characterValue < hangulUnicodeStartValue)
        return character; // for instance for 32 (space)

    final int tailIndex = Math.round((characterValue - hangulUnicodeStartValue) % 28) - 1;
    final int vowelIndex = Math.round(((characterValue - hangulUnicodeStartValue - tailIndex) % 588) / 28);
    final int initialIndex = (characterValue - hangulUnicodeStartValue) / 588;
    final String leadString = initials.substring(initialIndex, initialIndex + 1);
    final String vowelString = vowels.substring(vowelIndex, vowelIndex + 1);
    final String tailString = tailIndex == -1 ? "" : finals.substring(tailIndex, tailIndex + 1);// may be -1 when there is no tail character
    return leadString + vowelString + tailString;
}
Run Code Online (Sandbox Code Playgroud)

请注意,?(来自首字母)与?(来自尾)与所有首字母与尾的情况不同。

还要注意,由于索引从 0 开始而不是 1 作为韩国写作系统的例子,我们必须减去 1tail而不是加 1 for vowelandlead

例如,要测试上述代码,您可以使用包含三个和四个字符的两个值:

@Test
public void deconstructKoreanCharacters() {
    final String koreanText = "??? ?? ?? ?? ?? ???, ? ? ???";
    for (int i = 0; i < koreanText.length(); i++) {
        final String character = koreanText.substring(i, i + 1);
        final String decomposedCharacters = getCharacter(character);
        System.out.println(character + ":" + decomposedCharacters);
    }
    Statics.doNothing();
}
Run Code Online (Sandbox Code Playgroud)

如果从需要两个字符?,从而??这可能是一个有点体力劳动,作为可能的尾字符数为27(包括单个字符的尾巴)

  • @mwo07 我对你的问题也很满意——因为它一直困扰着我一段时间。(旁注:有趣的是,当人们不理解一个问题时,他们会认为提问者是错误的。) (2认同)