Google AdSense (text)

hidden logo stop

Moving

거지 같은 이글루스 광고노출 정책이 싫어서,
새 보금자리(http://blog.leocat.kr/)로 이사감.

[Unicode] 같은 한자의 다름 (동형이음) Computer & Program

한자에는 같은 형태이지만 서로 다르게 읽는 경우가 있다. "金"이라고 쓰지만, "쇠 금"으로도 읽을 수 있고 "성 김"으로도 읽을 수 있다. 비슷한 한자로 "樂"도 있다. 이 녀석은 "낙", "락", "악", "요"로 읽힌다.
아하~ 그래 여기까지는 좋다. 하지만 이 녀석들이 유니코드로 표현될 때는 그 값이 서로 다르다. 위키피디아 한중일 호환용 한자에 보면 설명이 잘 나와있다. "樂"는 아래표와 같이 구분된다. 각각의 유니코드와 UTF-8 코드값은 다르지만, 대표자는 "악"이다. 유니코드에서는 동형이음 한자의 경우는 대표자는 한중일 통합 한자(CJK Unified Ideographs) 코드 블럭에 포함되고, 나머지는 한중일 호환용 한자(CJK Compatibility Ideographs) 코드 블럭에 포함된다.

소리한자KS X 1001유니코드UTF-8대표
0xD1E2U+F914ef a4 94
0xD5A5U+F95Cef a5 9c
0xE4C5U+6A02e6 a8 82O
樂0xE8F9U+F9BFef a6 bf

Java에서는 여기에 있는 것처럼 유니코드 블럭을 확인할 수 있다. 한자의 경우 예를 들면, 아래의 코드에 포함되는지 확인하면 될듯.. (한자는 코드 블럭이 정말 많다. 아래의 코드 블럭 외에 supplement 등도 있고 많다.)

System.out.println(Character.UnicodeBlock.of('樂')); // 낙
System.out.println(Character.UnicodeBlock.of('樂')); // 락
System.out.println(Character.UnicodeBlock.of('樂')); // 악
System.out.println(Character.UnicodeBlock.of('樂')); // 요

Character.UnicodeBlock unicodeBlock = Character.UnicodeBlock.of('樂');
if(UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS.equals(unicodeBlock)
        || UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A.equals(unicodeBlock)
        || UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B.equals(unicodeBlock)
        || UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS.equals(unicodeBlock))
System.out.println("한자 포함~!!");




같은 형태의 한자이지만 코드로 표현하면 서로 다른 문자가 되기 때문에 문제가 발생할 수 있다. 최근 강연 열풍(?)을 타고 TED처럼 진행되는 열정樂서라는 행사가 있다. 자.. 여기에 있는 "樂"을 쓸 때 어떤 한자를 이용해서 검색할 것인가??

내가 처음 생각할 때는 즐거운 마음(즐거울 락)으로 벽에 낙서하다 라는 중의적인 의미로 "열정낙서"인줄 알았다. 이 제목의 책을 찾기 위해 낙(U+F914)을 사용해서 검색을 하면 검색이 되지 않는다. 락(U+F95C)를 사용해야 한다. 책 판매자는 즐거울 락(U+F95C)으로 생각하고 책 제목을 등록했나보다. 나는 낙서를 즐겁게 한다고 해석해서 樂을 낙(U+F914)으로 읽었는데.. 판매자와 나의 미스 커뮤니케이션.. 나는 락(U+F95C)으로 읽지 않으면, 책을 검색할 수 없고 살 수도 없다.

이런 문제는 영문의 case insensitive처럼 해결할 수 있을 것 같다. 대소문자 구분 없이 매칭하려면 비교하려는 두 문자를 모두 대문자로 바꾸거나 소문자로 바꿔서 비교하는 것처럼 말이다. 대소문자 구분이 없으니 한자를 모두 대표자로 바꿔서 같은지 비교하면 "열정樂(U+F914)서"와 "열정樂(U+F95C)서"는 모두 "열정樂(U+6A02)서"로 변환돼서 매칭이 가능하게 될 것이다. (어디까지나 내 생각이며.. 한자 치환 매핑 정보가 필요하다.)

역시나 다들 같은 생각을 하는지.. 한자 치환에 관련된 내용도 있다. 그리고 크롬 브라우저에서는 호환한자로 써도 통합한자로 자동변환된다는 얘기도 있다. 실제로 검색해 보면 정말 호환형 한자는 모두 악(U+6A02)으로 변환된다.


항상 인코딩은 심오하다~ 어려버~ TㅅT

덧글

  • 할락궁이 2014/12/07 20:50 # 삭제 답글

    덕분에 난해한 문제를 쉽게 해결할 수 있었습니다.
    유독 樂자만 제대로 출력 안되는 문제가 있었는데,
    글꼴 최적화를 하다가 한 樂자만 남고 다른 樂자들이 탈락해서 생긴 문제였네요.
    감사합니다!
댓글 입력 영역

Google AdSense (text/image)