2016-12-02 1 views
1

한국어 단어 (a String)의 마지막 문자를 가져 오려고하는데 계획대로 작동하지 않습니다. 문자열이 "사람" 인 경우 "ㅁ"을 받고 싶지만 "람"이 표시됩니다.자바에서 한국어 단어의 마지막 문자를 가져 오기

이미 시도 무엇 :

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

"사람""ㅁ"word.endsWith("ㅁ")을 사용하여 끝나는 경우 나 또한 확인했지만, false를 돌려 보냈다.

제가 물으면 진실을 되돌려줍니다. 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 initialsThe 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에 해당을, 우리는 tail에서 1을 빼고하지 vowel 1을 추가하고 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

관련 문제