유니코드 정규화기

똑같이 보이는 문자열도 강세가 단일 코드 포인트로 있는지, 글자에 결합 기호가 더해진 형태인지에 따라 서로 다른 바이트 시퀀스로 저장될 수 있습니다. 이 정규화기는 텍스트를 네 가지 유니코드 정규화 형식(NFC, NFD, NFKC, NFKD) 사이에서 변환해, 데이터베이스, 검색 색인, 중복 제거 스크립트, 정규식 매칭에서 문자열이 깔끔하게 비교되도록 합니다.

유니코드 텍스트를 정규화하는 방법

  1. 1

    입력 붙여넣기

    문자열을 넣으세요: 강세 글자, CJK 텍스트, 합자, 일관되지 않게 느껴지는 무엇이든.

  2. 2

    형식 선택

    NFC(합성, 흔히 쓰는 웹 형식), NFD(분해), NFKC(호환 합성), NFKD(호환 분해) 중에서 고릅니다.

  3. 3

    수치 비교

    도구가 전후의 문자 수(코드 포인트 수)와 바이트 길이를 보고해, 형식이 문자열을 줄였는지 늘렸는지 볼 수 있습니다.

  4. 4

    정규화된 출력 복사

    결과를 데이터베이스, API 페이로드, 슬러그 생성기, 테스트 픽스처에 사용합니다.

네 가지 형식과 각각을 언제 쓸지

유니코드 정규화는 표준 부속서 UAX #15로 정의됩니다. 네 가지 형식은 두 축으로 갈립니다: 정준 대 호환, 그리고 합성 대 분해.

나란히 보는 참고표

형식 합성 매핑 언제 쓰나
NFC 합성 정준만 웹 콘텐츠, 데이터베이스, 파일명의 기본값
NFD 분해 정준만 문자별로 강세를 제거하는 텍스트 처리
NFKC 합성 호환 포함 검색, 식별자, 스팸 필터, 표시 폴딩
NFKD 분해 호환 포함 발음 구별 기호 제거 전의 공격적 정규화

정준 형식은 의미를 지킵니다

é를 입력하고 형식을 바꿔 보세요. NFC는 1자, 2바이트로 보고하고(단일 코드 포인트 U+00E9), NFD는 2자, 3바이트로 보고합니다(맨 e 뒤에 결합용 어큐트 악센트 U+0301이 붙은 형태). 둘은 화면에서 똑같아 보이지만 서로 다른 바이트 시퀀스이며, 바로 이 불일치를 정규화가 바로잡습니다. 정준 형식은 바이트만 재배열하므로, 어느 형식이든 é는 언제나 어큐트 악센트가 붙은 e를 뜻합니다.

“호환”이 실제로 바꾸는 것

K 형식(NFKC, NFKD)은 비슷해 보이지만 다른 서식을 지닌 문자도 다시 씁니다. 이는 손실이 있는 변환이라 원본을 되돌릴 수 없습니다. 예를 들어:

  • fi(U+FB01, 라틴 소문자 합자 fi)는 fi(두 글자)가 됩니다
  • ①(U+2460, 동그라미 친 숫자 1)은 1이 됩니다
  • ㌀(U+3300, CJK 정사각형 “apaato”)는 アパート가 됩니다
  • 전각 A(U+FF21)는 A가 됩니다

검색과 중복 제거에는 강력하지만 서식에는 파괴적이므로, 시각적 충실도가 중요하지 않을 때만 K 형식을 고르세요.

실용적 규칙

  • 사용자 콘텐츠는 NFC로 저장하세요.
  • 식별자는 NFC로 비교해, 단일 코드 포인트로 쓴 café와 e + U+0301로 쓴 café가 일치하게 하세요. fi와 fi, 전각 A와 A까지 같게 비교하려면, UAX #31의 식별자 규칙처럼 NFKC로 올리세요.
  • 강세를 뗀 슬러그는 NFD로 정규화한 뒤 결합 기호 블록 U+0300~U+036F를 제거해 만드세요.

자주 묻는 질문

보통 입력이 이미 대상 형식이었다는 뜻입니다. 출처가 섞인 텍스트(Mac 파일명, 복사한 PDF 조각, 오래된 데이터베이스 행)를 붙여 넣으면 문자 수와 바이트 수가 바뀌는 것을 볼 가능성이 훨씬 큽니다.

표시용 URL에는 NFC. 순수 ASCII를 원하는 슬러그에는 NFD로 정규화하고 U+0300~U+036F에 대한 정규식으로 결합 기호를 제거한 다음 소문자로 만드세요. 합자와 동그라미 친 숫자도 폴딩하려면 NFKD가 대안입니다.

정준 형식(NFC, NFD)은 의미를 절대 바꾸지 않고 바이트만 재배열합니다. 호환 형식(NFKC, NFKD)은 의미를 바꿉니다: 합자가 쪼개지고, 전각 글자가 폴딩되고, 위 첨자가 평평해집니다. 그것이 원하는 바일 때만 쓰세요.

정규화는 저희 서버에서 PHP의 Normalizer 클래스로 실행되고 결과는 같은 요청에서 돌아옵니다. 텍스트는 저장되지 않습니다. 저희는 어떤 형식이 적용되었는지 기록하는 익명 이벤트만 남기며, 내용 자체는 절대 남기지 않습니다.

관련 도구

이 도구는 다른 언어로도 제공됩니다