-
normalize — 유니코드 정규화Today I Learned 2025. 4. 18. 23:25
문제점
json 데이터의 "힙합보이" 문자열과 외부 API에서 받는 "힙합보이" 문자열이 서로 다르다고 나온다.
const filtered = data.filter((entry) => entry.item_name === filteredName);
해결 - normalize 유니코드 정규화
한글같이 복잡한 문자는 내부적으로 여러개의 코드 포인트로 저장될 수 있다고 한다.
예를 들어 “힙합” 은
- NFC(결합형) 모드에서는 단일 코드 포인트 "힙" "합"
- NFD(분해형) 모드에서는 초성·중성·종성 조각 세 개의 코드 포인트 "ㅎ" "ㅣ" "ㅂ" "ㅎ" "ㅏ" "ㅂ"
으로 표현된다.
name.normalize("NFC")으로 모두 완전히 동일한 문자열로 바꿔주었다.
const filtered = data.filter((entry) => entry.item_name.normalize("NFC") === filteredName..normalize("NFC"));
전체 코드
function normalizeKey(s: string) { return s.trim().normalize("NFC"); } function useManifest(filteredName: string) { return useQuery<ManifestEntry[]>({ queryKey: ["image-manifest", filteredName], queryFn: () => axios.get<ManifestEntry[]>("/data/image-manifest.json").then((res) => res.data), staleTime: Infinity, select: (data) => { const filtered = data.filter((entry) => normalizeKey(entry.item_name) === normalizeKey(filteredName)); return filtered; }, }); }
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/normalizeString.prototype.normalize() - JavaScript | MDN
normalize() 메서드는 주어진 문자열을 유니코드 정규화 방식(Unicode Normalization Form)에 따라 정규화된 형태로 반환합니다. 만약 주어진 값이 문자열이 아닐 경우에는 우선 문자열로 변환 후 정규화합
developer.mozilla.org
'Today I Learned' 카테고리의 다른 글
[TIL] 0729 표현식과 문 (0) 2024.07.29 [TIL] 0620 프로젝트 리팩토링 마무리 (0) 2024.06.20 [TIL] 0618 변수 (0) 2024.06.18 [TIL] 0612 (0) 2024.06.12 [TIL] 0607 (0) 2024.06.07