2016-12-02 3 views
1

Я пытаюсь получить последний символ корейского слова (String), но он не работает так, как планировалось. Если у меня есть строка: "사람", я хочу получить "ㅁ", но я получаю "람".Получить последний символ корейского слова в java

То, что я уже пробовал:

word.charAt(word.length-1); // gets 람 

Я также проверил, если "사람" заканчивается "ㅁ" использованием word.endsWith("ㅁ"), но он вернулся ложным.

Верно, если я спрашиваю, word.endsWith("람").

+0

'word.charAt (word.length() - 1) == '람'' соответствует 'word.endsWith (" 람 ") == true'. Можете ли вы объяснить, почему вы ожидаете другого результата? – Bill

+1

[Проверить этот ответ] (http://stackoverflow.com/questions/10472294/how-to-convert-to-korean-initials) Это объясняет многое о кодировании и декодировании корейских строк – Gatusko

+0

AFAICT, корейский язык в настоящее время обычно написан в строки, слева направо (например, английский), поэтому '' 사람 "' заканчивается символом '' 람 "'. Ожидаете ли вы интерпретацию справа налево (например, арабский)? – Bohemian

ответ

3

Этот ответ использует информацию от How to convert to Korean initials и The Korean Writing System. Как описывает последний, Хангул разделен на (возможно) три части: начальный, гласный и хвостовой согласный (если присутствует). Консонант хвоста может состоять из 2 согласных, таких как .
Юникод кодирования было, ИМХО, довольно блестяще разработан таким образом, что хангыль кодирование символов может быть закодирована/декодируется с использованием формул, как описано (система корейского письма), как:

tail = mod (Hangul codepoint − 44032, 28) 
vowel = 1 + mod (Hangul codepoint − 44032 − tail, 588)/28 
lead = 1 + int [ (Hangul codepoint − 44032)/588 ] 

Так как мне нужно то же самое вещь, как вы описали, я осуществил следующее:

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; 
} 

Обратите внимание, что (от инициалов) не то же самое, как (из хвостов), как для всех инициалов против хвостов.

Следует также отметить, что из-за индекса, начиная с 0, а не 1, как, например, из корейской письменности системы, мы должны вычесть 1 из tail и не добавить 1 для vowel и lead

Чтобы проверить код выше , вы можете использовать, например, который содержит два три и четыре значения символов:

@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(); 
} 

Если вам нужны оба персонажа из , таким образом и это может быть немного ручной работы, так как число возможных хвоста персонажи - 27 (включая односимвольные хвосты)

+0

Спасибо, чувак, это работает даже лучше, чем ожидалось! – Vural

+1

@ mwo07 Я тоже вполне доволен вашим вопросом - поскольку это беспокоило меня какое-то время. (Примечание: интересно, что, когда люди не понимают вопроса, они предполагают, что опрос неверен.) – Danielson

Смежные вопросы