새로운 질서 위키

유니코드 정규화

  • 유니코드 정규화(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.

기타 등등

  • 각각 정규화한 두 문자열을 이어 붙였다고 해서 결과도 정규화된 상태인 것은 아니다. 유니코드 FAQ는 접합부에서 다시 정규화가 필요할 수 있다고 설명한다. 출처
  • NFC로 정규화하면 항상 문자열이 짧아지는 것은 아니다. 유니코드 FAQ는 호환성과 안정성 때문에 일부 문자가 더 긴 배열로 바뀔 수 있다고 설명한다. 출처

#문자 #개념 #프로그래밍