한글은 종성의 유무에 따라서 조사가 달라질 때가 많습니다. 예를 들어, 목적어엔 조사로 '나를'처럼 '를'을 붙여야 하지만, 종성이 있으면 '밥을'처럼 '을'을 붙여야 합니다. 그래서 문자열 마지막 글자가 종성을 갖는지 판별하는 코드가 필요합니다. 저는 그걸 다음처럼 처리했습니다.

우선 문자열이 UTF-16이 아니라면, UTF-16으로 변환합니다. 조합형 캐릭터 셋으로 변환해서 처리해도 되겠지만, 조합형 캐릭터 셋은 관련 자료를 찾기 어려워서 유니코드가 더 낫습니다. UTF-16 문자열의 마지막 2바이트를 얻어 내서, 그 값이 한글 음절 코드 포인트 범위(AC00~D7A3) 안에 속하는지 확인합니다. 만약 그 값이 범위 안에 속하고 (값 - AC00) % 28이 0이 아니라면, 종성을 가지는 것입니다.

실제 소스 코드는 다음과 같습니다.

bool does_last_character_have_tail_consonant(const string& text)
{
int utf16_character_count = MultiByteToWideChar(CP_ACP, 0, text.c_str(), text.size(), NULL, 0);
if (utf16_character_count == 0)
return false;

wstring utf16_text(utf16_character_count, L'\0');
MultiByteToWideChar(CP_ACP, 0, text.c_str(), text.size(), &utf16_text[0], utf16_character_count);

if (utf16_text.size() < 1)
return false;

wchar_t last_character = *utf16_text.rbegin();
return 0xac00 <= last_character && last_character <= 0xd7a3 && (last_character - 0xac00) % 28 != 0;
}

참고:
2010/10/01 22:24 2010/10/01 22:24

트랙백 주소 :: http://www.easyisright.net/trackback/657

댓글을 달아 주세요

  1. jjm 2010/10/25 15:33  댓글주소  수정/삭제  댓글쓰기

    아 한글 처리 너무 시러요 코드만 봐도 징글징글함요