Intl.Collatorはlocaleと設定に応じて文字列の順序を比較する。多言語や数字を含む名前を単純な文字コード順に並べる方法とは目的が異なる。結果がゼロでも原文が同一とは限らず、識別子や権限確認へそのまま使うべきではない。

数値部分やアクセント・大文字小文字の扱いを含むロケール別照合の概念図

数値の大きさより符号を読む

ECMA-402は先に並ぶなら負、後なら正、相対順を区別しなければゼロを返すと定義する。実際の数値は実装によるので、必ず-1や1になると考えない。負・正・ゼロの意味が比較契約である。

一つの一覧ではlocaleと設定を決めたCollatorを一貫して使う。比較の途中で異なる設定を混ぜると一覧の規則を説明しにくい。非ゼロ値の大きさを文字列の距離や類似度と読むことも、規格が定める意味とは異なる。

言語によって基準の文字が変わる

MDNはドイツ語とスウェーデン語のäの例を示す。ドイツ語ではaと関係する順序だが、スウェーデン語ではzの後になる。すべての言語に同じアルファベット順があるとは限らない。表示一覧の言語方針とlocaleを合わせる必要がある。

対応する言語を確認し、resolvedOptionsで実際の設定を調べることも大切だ。利用者向けの順序と、複数システムで保つ内部キーの要求は違うことがある。表示用の言語比較を、すべての保存順序に共通する規則へ自動で転用しない。

numericは文字列の比較設定

MDNの生成子案内はnumericで1、2、10の順を作る例を示す。item2とitem10のような名前で検討できる。まず文字式の順序と数字順のどちらを求めるかを定める。目的が分かれば設定の適否を判断しやすい。

これは一般的な数値パーサーや単位変換ではない。金額、小数、バージョン表記を含むすべての値を業務上正しく並べる保証はない。実際の名前を比較し、数値フィールドの順序と表示文字列の順序を区別するのが実務的だ。

専門的視点:sensitivityの同等性

MDNとECMA-402はsensitivityが大文字小文字や発音区別記号などの差を比較へ反映するか決めると説明する。baseなら同じ基準文字の変形は同等になり得る。ただし何を同じ基準と見るかは言語にも依存する。

MDNの例でドイツ語のäとaはbase比較で同等だが、スウェーデン語では区別する。その同等性はバイト単位の同一性ではない。利用者名の重複や永続識別子の規則を表示比較だけで決めてはいけない。同等な項目に追加の順序が必要なら別基準を定める。

accentは基準文字と発音区別記号を反映し、大文字小文字は区別しない。caseは大文字小文字を反映するが、同じ基準文字の発音区別差を無視する。名前だけでなく、製品が残すべき違いの具体例で設定を確認する。

sortとsearchの目的を混同しない

MDNはsearchでは文字列全体の比較がゼロかを見る用途を説明し、非ゼロ値で並べ替えないよう案内する。部分文字列検索やすべての検索処理を代行する意味ではない。一覧順にはsortを使い、同等性の一致にはその目的の方針を検討する。

locale、numeric、sensitivityを別々に変え、実際の製品名と多言語例を比較する。同一表記、数字を含む名前、異なるのに同等となる原文を含めると境界が分かる。比較の符号だけを保存するのではなく、どの設定で比べたかも検証結果へ残す。

たとえば表示上は同じ扱いの二項目でも、詳細画面へ移るためのIDは別に維持する。順序を決める規則と項目を識別する規則を分ければ、表示のための同等性でデータをまとめて失うことを避けられる。これは製品設計の適用例であり、Collator自身が識別子を管理するわけではない。

言語別の比較道具として使い、表示順、完全一致、数字の業務的な意味を別に定義すると結果を正しく解釈できる。必要な言語の実装と設定を確認し、すべての環境で同じ細部の順序を保証すると説明しないことも重要だ。

出典