Intl.Collator는 언어와 옵션에 맞춰 문자열의 정렬 순서를 비교한다. 숫자가 섞인 이름이나 다국어 목록을 단순한 문자 코드 순서로 정렬하는 것과 목적이 다르다. 그러나 비교 결과가 0이라고 두 원문이 동일한 문자열인 것은 아니며, 이 값을 식별자나 권한 검사에 그대로 사용할 수는 없다.

로케일별 정렬에서 숫자 구간과 악센트·대소문자 민감도 차이를 나타낸 개념도

비교 결과는 크기보다 부호를 읽는다

ECMA-402는 앞에 정렬되는 문자열에 음수, 뒤에 정렬되는 문자열에 양수, 상대 순서를 구분하지 않는 경우에 0을 반환하도록 정의한다. 실제 반환 숫자는 구현에 따라 달라질 수 있으므로 정확히 -1이나 1이 나올 것으로 가정하면 안 된다. 양수·음수·0의 의미가 비교 계약이다.

하나의 목록을 같은 규칙으로 정렬하려면 원하는 locale과 옵션을 정한 Collator를 일관되게 사용한다. 비교할 때마다 서로 다른 설정을 섞으면 한 목록이 어떤 기준으로 정렬됐는지 설명하기 어렵다. 결과의 수치 크기를 차이의 정도나 유사도 점수로 읽는 것도 규격의 의미와 맞지 않는다.

언어가 다르면 기준 문자도 다르다

MDN은 독일어와 스웨덴어의 ä 정렬 예제를 제공한다. 독일어에서는 a와 관련된 순서에 놓이는 반면 스웨덴어에서는 z 뒤에 온다. 따라서 모든 언어에 같은 알파벳 순서가 있다고 가정할 수 없다. 사용자가 보는 목록의 언어 정책과 선택한 locale이 맞아야 한다.

명시한 locale이 실제로 어떤 설정으로 해석됐는지 확인하는 것도 중요하다. 지원되는 환경과 필요한 언어를 검토하고 resolvedOptions로 적용된 설정을 조사할 수 있다. 사용자 표시용 목록의 순서와 여러 시스템에서 유지할 내부 정렬 키는 요구가 다를 수 있으므로, 언어별 비교를 모든 저장 순서의 공통 규칙으로 삼지는 않는다.

numeric은 숫자 문자열의 비교 옵션이다

MDN 생성자 안내의 numeric 옵션은 1, 2, 10 같은 문자열을 숫자 순서로 비교하는 예를 든다. 파일 이름의 항목2와 항목10 같은 경우에 검토할 수 있다. 기본 문자식 비교와 어떤 결과가 필요한지 먼저 정하면 옵션을 선택하기 쉽다.

이 옵션이 일반적인 숫자 파서나 단위 변환은 아니다. 금액, 소수 표기, 버전 번호처럼 여러 규칙이 섞인 값을 모두 업무상 올바른 순서로 정리한다고 보장하지 않는다. 실제 목록의 예제를 비교하고, 명확한 수치 필드가 있다면 그 필드의 정렬 요구와 표시 이름의 정렬 요구를 구분하는 것이 실무적으로 적절하다.

전문 관점: sensitivity가 만드는 동등함

MDN 전문 안내와 ECMA-402는 sensitivity가 대소문자나 발음 구별 표시 등 어떤 차이를 비교에 반영할지 정한다고 설명한다. base를 사용하면 같은 기본 글자로 취급되는 변형은 비교상 동등할 수 있다. 그러나 무엇을 같은 기본 글자로 보는지는 언어별 규칙에 영향을 받는다.

MDN 예제에서 독일어의 ä와 a는 base 비교에서 동등하지만 스웨덴어에서는 구별된다. 이 동등함은 문자열이 바이트 단위로 같다는 뜻이 아니다. 사용자 이름의 중복 판정이나 영구 식별자를 만들 때 표시 정렬용 비교를 그대로 적용하지 말아야 하는 이유다. 같은 비교 결과 안에서 추가 순서가 필요하다면 별도의 기준을 명시한다.

accent는 기본 글자와 발음 구별 표시의 차이를 반영하면서 대소문자는 구별하지 않는다. case는 대소문자를 반영하지만 같은 기본 글자의 발음 구별 차이는 구별하지 않는다. 어떤 차이를 무시할지 이름만 보고 판단하지 말고 실제 비교 예제를 정한다.

sort와 search의 용도를 혼동하지 않기

MDN은 usage가 search일 때 전체 문자열의 비교 결과가 0인지 아닌지를 중심으로 해석하고 정렬에는 쓰지 말라고 안내한다. 이는 부분 문자열 찾기나 모든 검색 동작을 대신한다는 뜻도 아니다. 목록 정렬은 sort 용도로, 동등함 기반의 일치는 그 목적에 맞는 정책으로 검토한다.

검증에서는 locale, numeric, sensitivity를 각각 바꿔 실제 제품 이름과 다국어 예제를 비교한다. 동일 문자 표기, 숫자가 포함된 이름, 비교상 동등한 두 원문을 포함하면 설정의 한계가 드러난다. 예를 들어 표시상 동등한 두 항목도 상세 화면에 필요한 ID는 따로 유지한다. 순서와 식별의 규칙을 나누면 표시용 동등함 때문에 항목을 합쳐 잃는 문제를 피할 수 있다. Collator 자체가 ID를 관리하는 것은 아니다.

Collator는 언어별 문자열 비교 도구이며, 표시 순서·정확한 동일성·업무상 숫자 의미를 따로 정의할 때 결과를 올바르게 사용할 수 있다.

출처