日本語

テキストおよび日常ツール · テキスト ツールキット

並べ替えられたリストがコンピューター間で異なる理由: ロケールを考慮した並べ替えの説明

· なぜそれが重要なのか

テキストツール 並べ替え ロケール

同じ多言語リストを 2 つの異なるアルファベット順に並べたもの
オリジナル ToolAcre ベクトル イラスト

コードポイント順序とロケール照合の違い、ä、é、および大文字が異なるマシンの異なる場所に配置される理由、および予期せぬことなくソートされたリストを共有する方法について説明します。

同じリスト、2 つの順序 — 同僚の分類によりオングストロームは別の場所に配置され、どちらも間違っていません

チーム リーダーは、同じ出席者名のリストを 2 か国の同僚に送信し、妥当な 2 つのアルファベット順を受け取ることができます。アルファベットの配置は、表示される基本文字だけによって決まるわけではないため、アクセント付き文字を含む名前は、通常、意見の相違点となります。ブラウザ環境は比較に参加します。

どちらの同僚も手作業によるミスを犯している必要はありません。実際の問題は、「アルファベット順に並べ替え」では、多言語テキストの 1 つの普遍的な順序が特定されないことです。追加または削除を確認する前に、完了したどの注文が信頼できるかに同意してください。そうしないと、行ごとの比較で、個別の並べ替えの決定によってのみ生じた移動が表示されます。

コードポイントの順序 — 単純な並べ替えでは、すべての大文字がすべての小文字の前に配置され、アクセント付き文字が最後に配置される理由

アウトラインでは、小文字の前に大文字を配置し、最後にアクセント付き文字を配置する単純なコードポイントの並べ替えについて説明していますが、これは Text Toolkit が実装するものではありません。その `sortLines` 関数は行をコピーし、各ペアを `localeCompare` と比較するため、生の文字番号ではなくブラウザーの照合規則が参照されます。

大文字と小文字の区別も関数オプションで明示されています。大文字と小文字を区別する並べ替えでは `variant` の感度が要求されますが、デフォルトの大文字と小文字を区別しないモードでは `base` の感度が要求されます。これにより、大文字と小文字が異なる形式やアクセント付きの形式が同等のものとして比較され、大文字を別のブロックに強制するのではなく、ソーターに供給される安定した順序に依存した相対的な配置が残されます。

ToolAcre は単純なコードポイント順序を使用しません。行ごとに localeCompare を呼び出します。

比較では `undefined` をロケールとして渡し、ランタイムにデフォルトのロケール動作を使用するように要求します。ソースはスウェーデン語、ドイツ語、英語、またはその他の名前付き照合順序を保証しておらず、この関数で表されるインターフェイスにはロケール引数がありません。したがって、ここで正確な国家命令を公表することは、実施の証拠を超えることになるでしょう。

この境界は、どの設定が特定の違いを引き起こしたのかを正確に証明することなく、結果が異なる可能性がある理由を説明します。再現性が重要な場合はブラウザと環境を記録しますが、アクセント付きの名前の位置からロケールを推測しないでください。信頼できる事実は、ツールキットは共有言語を固定するのではなく、ランタイムのデフォルトで順序付けを `localeCompare` に委任するということです。

ブラウザはデフォルトのロケールを提供しますが、ツールキットはロケール セレクターを提供しません

数字の実行も特別な扱いを受けます。この関数は、`numeric` をデフォルトで true に設定し、そのオプションを `localeCompare` に転送します。したがって、`item2` と `item10` を含むリストは、10 の文字 `1` と 2 の文字 `2` を比較するのではなく、小さい方の数値を昇順で最初に配置することを目的としています。

ゼロ埋め込みは、動作が不明な別のソーターをデータが通過する必要がある場合には依然として役立ちますが、ここでは数値を意識した順序付けを取得する必要はありません。代わりに正確な字句順序が必要な場合、基になる関数は数値比較をオフにすることをサポートします。重要な教訓は、すべてのアルファベット順のコマンドが埋め込まれた数字を同様に扱うと仮定するのではなく、選択したオプションを文書化することです。

Digit はデフォルトで数値的にソートを実行するため、item2 が item10 の前に来ます。

確認可能な例として、`Ångström`、`Ana`、`Émile`、`item2`、`item10` を別々の行に配置し、チームが選択したブラウザーで一度並べ替えます。その出力を参照として保存します。リポジトリには、それを確立するピン留めされたロケール フィクスチャが含まれていないため、この記事では、2 番目のブラウザで予想されるアクセント付き名の順序を意図的に公開しません。

同僚が別の注文をした場合は、完成した 2 つのテキストを行ベースの差分と比較します。 diff 実装は、最長共通部分シーケンス テーブルを通じて完全に等しい行を整列させ、一致しない行を追加または削除としてラベル付けします。構造の動きは忠実に報告されていますが、どのロケールの比較によって名前がどちらかの位置に配置されたかについては説明されていません。

実用的な例: 2 つのロケール結果を作成する代わりに、ブラウザーで生成された 1 つの注文を比較します。

最も単純なコラボレーション ルールは、一度並べ替えて、その結果の行を共有することであり、単に並べ替えられていない入力と [並べ替え] を押す指示を加えるだけではありません。プレーンテキストの結果には、実際にレビューされた決定が保存されます。受信者は、自分のブラウザに環境依存の順序を再作成するよう要求することなく、そのアーティファクトを検索、注釈付け、または比較できます。

出所が重要な場合は、元のリストも保管してください。ソートされたコピーはレビュー用のプレゼンテーションですが、オリジナルには意味のある到着順序やソース順序が含まれる場合があります。参照ファイルに名前を付け、並べ替えが昇順、大文字と小文字の区別、数値のいずれであるかを記録すると、あいまいなアルファベット操作が反復可能なチームの引き継ぎに変わります。

これでカバーされないもの — 数値並べ替えオプション、逆順、および特定の列による並べ替え

元の概要では、数値の並べ替えオプションと逆順はカバーされていないと述べていますが、ソースはその制限と矛盾しています。 `sortLines` は数値オプションと昇順または降順の方向を受け入れますが、`reverseLines` は現在の行の順序を反転できます。これらの機能は、ツールキットのテキスト ロジックに含まれていないと説明すべきではありません。

特定の列による並べ替えは、実際にはこの関数の外にあります。すべての完全な行が比較値となるため、`Paris, Ana` などの行は、カンマ後の名前ではなく先頭からソートされます。フィールドが重要な場合は、適切なデータ ツールを使用して構造化された行を解析します。行ソートは列を理解しているふりをすべきではありません。

ツールキットは数値の並べ替えと逆順をカバーしますが、列による並べ替えはカバーしません。

ロケールを意識した並べ替えは、人間のアルファベットを 1 つの生の文字番号ルールに安全に還元することができないため便利です。また、固定されていないデフォルト ロケールはマシン間での再現性に関する契約ではないことも意味します。 Text Toolkit はブラウザー照合を使用し、デフォルトで大文字と小文字を区別せず、数値を認識した比較を行い、要求された方向を逆にすることができます。

複数の環境にまたがるチームの場合は、出力をコントラクトにします。ブラウザ セッションを 1 つ選択し、目的のオプションを設定し、並べ替えて、その正確なテキストを配布します。別の順序が表示された場合は、どのアルファベットが正しいかを議論する前に、成果物を比較してください。ソースはメカニズムの説明をサポートしますが、保存された結果は実装自体がグローバルに保証していない安定したシーケンスを提供します。