- 유니코드 정규화(Unicode normalization)는 동등한 문자를 서로 다른 코드 포인트 배열로 적었을 때, 비교와 처리에 사용할 형태를 맞추는 일이다. 문자의 모양이 같다고 내부 배열까지 같은 것은 아니다. 눈은 통과시켰지만 컴퓨터는 서류를 한 장 더 요구한다.
- 한글 ‘가’는 완성된 음절
U+AC00으로 나타낼 수도 있고, 조합용 자모U+1100과U+1161을 이어서 나타낼 수도 있다. 아래 자바스크립트 예제는 두 문자열의 엄격한 비교 결과가 정규화 전후에 달라지는 것을 보여준다. - NFC는 정준 분해 뒤 가능한 부분을 다시 합성하고, NFD는 정준 분해를 사용한다. NFKC와 NFKD는 호환성 차이까지 없애므로 서식상의 구별이 중요한 원고에 무조건 적용하지 않는다. 정규화는 교정이나 맞춤법 검사와 다른 작업이다.
- 텍스트 파일과 파일 이름에서 검색이나 비교가 어긋난다면 코드 포인트를 살펴볼 수 있다. 모든 운영 체제와 프로그램이 파일 이름을 같은 방식으로 처리한다고 가정하지 않는다. 복사본에서 원인을 확인하고 원본 이름을 일괄 변경하는 일은 별도로 판단한다.
- 글자의 개수도 세는 단위에 따라 달라진다. 코드 포인트 수와 사람이 한 글자로 읽는 단위는 항상 일치하지 않는다. 이 구별은 글자 수의 여러 기준에서 이어 살펴볼 수 있다.
const composed = "\uAC00";
const decomposed = "\u1100\u1161";
console.log(composed === decomposed); // false
console.log(composed.normalize("NFC") === decomposed.normalize("NFC")); // true
console.log([...composed].length, [...decomposed].length); // 1 2
참고: 유니코드 정규화 FAQ.