JavaScript normalize 함수로 유니코드 정규화하기

Jiumn·2024년 3월 25일

자바스크립트 normalize 함수

문제

  • 사용자가 액센트 기호가 포함된 영어 단어를 입력할 시에, (액센트 기호를 입력하지 못하니) 스펠링이 같더라도 오답으로 인식하는 경우가 발생했다. 기획팀에서 정책상 스펠링이 같으면 정답으로 입력을 원한다고 하여 개선이 필요했다.

해결

  • 참고: https://stackoverflow.com/questions/990904/remove-accents-diacritics-in-a-string-in-javascript
  • 자바스크립트의 normalize 함수를 통해 유니코드 문자열로 정규화한다. 이때 NFD 방식으로 정규화를 한다. 그런 다음 replace로 해당 액센트를 제거해준다.
  • 문자열을 유니코드 정규화해야 하는 이유는 같은 문자라고 하더라도 다른 방식으로 조합될 수 있기 때문이다. 예를 들어 è의 경우 하나의 코드포인트(텍스트를 표현하기 위한 시스템(예, 유니코드)에서 추상 문자를 나타내기 위해 할당된 숫자)로 나타낼 수도 있지만 e와 악센트 기호를 분리한 2개 이상의 코드포인트로 나타낼 수도 있다.
  • 이러한 차이를 이해한다면 e를 입력했다고 했을 때, è와 같이 인식하게 하려면 어떻게 해야 할까?
  • 자바스크립트 normalize 함수를 통해 유니코드를 NFD 방식으로 정규화하고 악센트 기호를 분리하면 된다. NFD(Normalization Form DeComposition) 방식은 정준 분해(표준 분해)를 의미한다.
    예를 들어, À (U+00C0) → A (U+0041) + ◌̀ (U+0300)와 같이 분해된다.
  • 아래는 스택오버플로우에 나온 예시다.
const str = "Crème Brulée"
str.normalize("NFD").replace(/[\u0300-\u036f]/g, "")
> "Creme Brulee"
profile
Back-End Wep Developer. 꾸준함이 능력이다. Node.js, React.js를 주로 다룹니다.

0개의 댓글