Unicode Normalization

Compatibility Equivalence 와 canonical equivalence 라는 두 이슈를 해결하기 위한 솔루션을 의미한다.

Compatibility Equivalence

같은 의미를 가지지만 실제 유니코드값이 다른 경우가 존재한다. 예를 들어, individuality 는 🅘🅝🅓🅘🅥🅘🅓🅤🅐🅛🅘🅣🅨 와 같은 특수문자로 표현할 수 있는데, 이는 당연히 다른 유니코드를 가진다. 다른 예로는 한자 쇠금 (金) 이라고 해도 ‘ 금 ’ 을 입력하고 변환한 金과 ‘ 김 ’ 을 입력하고 변환한 金의 유니코드가 다르다.

Canonical Equivalence

문자가 나뉘어져 있지만 합치면 의미를 가지는 경우가 있다. 예를 들어, ㄱ ㅏ 라는 문자를 합친 (conjoined) 결과와 동일하다.

Solution (python)

python 에서는 unicodedata 라는 라이브러리를 통해 유니코드 정규화를 진행할 수 있다.

unicodedata.normalize("NFKC", "Ⓣⓗⓐⓝⓚⓢ ⓕⓞⓡ ⓡⓔⓐⓓⓘⓝⓖ 감사합ㄴㅣ다")
# 'thanks for reading 감사합니다'

개인적으로 한가지 아쉬운 점은 한글의 경우 아래 모음은 처리하지 못한다는 것이다. 예를 들어 의 경우 ㄱㅣㅁ 으로 작성해도 기ㅁ 으로 정규화된다.

NFKC 는 정규화 옵션인데, KC 를 이용한 Normalized Form 이라는 뜻이다. compatibility equivalence 를 먼저 처리하고, 이때 나누어진 문자를 합쳐서 canonical equivalence 를 해결한다.
예시) ℌ ̧ → H ̧ → 

Related

References