Этот ответ использует информацию от 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 (включая односимвольные хвосты)
'word.charAt (word.length() - 1) == '람'' соответствует 'word.endsWith (" 람 ") == true'. Можете ли вы объяснить, почему вы ожидаете другого результата? – Bill
[Проверить этот ответ] (http://stackoverflow.com/questions/10472294/how-to-convert-to-korean-initials) Это объясняет многое о кодировании и декодировании корейских строк – Gatusko
AFAICT, корейский язык в настоящее время обычно написан в строки, слева направо (например, английский), поэтому '' 사람 "' заканчивается символом '' 람 "'. Ожидаете ли вы интерпретацию справа налево (например, арабский)? – Bohemian