[インデックス 13277] ファイルの概要
このコミットは、Go言語の実験的なロケールパッケージ exp/locale/collate
内の tables.go
ファイルに対する変更です。このファイルは、Unicode Collation Algorithm (UCA) に基づく文字列の照合(ソート順序の決定)に必要なデータテーブルを定義しています。具体的には、照合要素の展開ルールや、各Unicodeコードポイントに対応する照合要素の値などが含まれています。
コミット
このコミットは、以前に誤ったバージョンの照合テーブルがチェックインされてしまった問題を修正するものです。maketables
ツールを使用してテーブルを再生成し、正しいデータに更新しました。これにより、文字列の照合がUnicode標準に準拠し、期待通りの結果を返すようになります。
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/de0c1c9cf5598e53a335d14c1fc8d0f42fe81ebc
元コミット内容
exp/locale/collate: somehow an incorrect version of tables was checked in earlier.
Regenerated tables using maketables.
R=r, rsc
CC=golang-dev
https://golang.org/cl/6248067
変更の背景
Go言語の exp/locale/collate
パッケージは、国際化対応の一環として、異なる言語や地域における文字列の正しいソート順序(照合順序)を提供することを目的としています。この照合順序は、Unicode Collation Algorithm (UCA) という国際標準に基づいて定義されており、そのアルゴリズムを実行するために必要な大量のデータ(照合テーブル)を内部に持っています。
このコミットが行われる以前に、何らかの理由で古い、または不正確なバージョンの照合テーブルが src/pkg/exp/locale/collate/tables.go
に誤ってコミットされてしまったようです。これにより、Go言語の照合機能が期待通りに動作しない可能性がありました。このコミットは、その誤りを修正し、最新かつ正確な照合テーブルを反映させるために行われました。
前提知識の解説
Unicode Collation Algorithm (UCA)
UCAは、Unicode Consortiumによって定義された、多言語テキストの照合(ソート)順序を決定するための標準アルゴリズムです。単にコードポイントの数値順でソートするのではなく、言語ごとの慣習(例: ドイツ語の「ä」は「a」と「e」の間、または「ae」として扱われる、スペイン語の「ch」は一文字として扱われるなど)を考慮に入れた、人間にとって自然なソート順を提供します。
UCAは、各文字に「照合要素(Collation Element)」と呼ばれる一連の重み(プライマリ、セカンダリ、ターシャリなど)を割り当てることで機能します。これらの重みを比較することで、文字列の相対的な順序が決定されます。
照合テーブル
UCAを実装するためには、各Unicodeコードポイントがどのような照合要素にマッピングされるか、また特定の文字シーケンスがどのように展開されるか(例: ドイツ語の「ß」が「ss」に展開されるなど)といった情報が必要です。これらの情報は「照合テーブル」としてデータ化され、プログラムに組み込まれます。src/pkg/exp/locale/collate/tables.go
は、まさにこの照合テーブルをGoのコードとして表現したものです。
maketables
ツール
maketables
は、Go言語の exp/locale/collate
パッケージで使用される照合テーブルを生成するための内部ツールです。このツールは、Unicode Consortiumが提供するUCAのデータファイル(例: allkeys.txt
)を読み込み、それをGoのソースコード(tables.go
)として出力します。これにより、開発者が手動で巨大な照合テーブルを記述する手間を省き、常に最新のUCAデータに基づいて照合機能を提供できるようになります。
技術的詳細
tables.go
ファイルは、Goのソースコードとして照合テーブルのデータを保持しています。具体的には、rootExpandElem
や rootValues
といった名前のGoの配列([]uint32
型)として、大量の16進数データが定義されています。これらの配列は、UCAの照合要素や展開ルールを効率的にルックアップするための内部データ構造です。
このコミットの差分を見ると、rootExpandElem
と rootValues
の配列内で、多くの16進数値が変更されていることがわかります。これは、maketables
ツールがUnicodeの最新の照合データに基づいてこれらの配列を再生成した結果です。データの内容が変更されたのは、UCAの仕様更新、バグ修正、または以前の生成プロセスにおける何らかの不整合が原因であると考えられます。
maketables
ツールは、Unicodeのデータファイルを解析し、それをGoの定数や配列として表現することで、コンパイル時に照合データがアプリケーションに組み込まれるようにします。これにより、実行時に外部ファイルからデータを読み込む必要がなくなり、パフォーマンスと配布の容易さが向上します。
コアとなるコードの変更箇所
変更は src/pkg/exp/locale/collate/tables.go
ファイルに集中しています。具体的には、以下の2つの大きなuint32
型配列のデータが更新されています。
var rootExpandElem = [4630]uint32{...}
var rootValues = [25408]uint32{...}
これらの配列内の多くの16進数値が、以前のバージョンから新しいバージョンへと変更されています。差分では、変更された行が -
(削除) と +
(追加) で示されており、実質的には古いデータが新しいデータに置き換えられたことを意味します。
例:
- 0x40015F04, 0x00000002, 0x1644B704, 0x40015F1F,
+ 0x40015F04, 0x00000002, 0x01497604, 0x40015F1F,
上記のように、0x1644B704
が 0x01497604
に変更されている箇所が多数見られます。
コアとなるコードの解説
rootExpandElem
と rootValues
は、UCAの実装において中心的な役割を果たすデータ構造です。
rootExpandElem
: この配列は、特定の文字が複数の照合要素に「展開」される場合のルールを定義していると考えられます。例えば、ドイツ語の「ß」が「ss」として扱われる場合、これは展開ルールによって実現されます。配列内の各uint32
値は、照合要素の重みや、次の展開ルールへのポインタなどをエンコードしている可能性があります。rootValues
: この配列は、各Unicodeコードポイントに対応する基本的な照合要素の値を格納していると考えられます。UCAでは、各文字にプライマリ、セカンダリ、ターシャリといった複数の重みが割り当てられますが、これらの重みがuint32
値としてパックされて格納されている可能性が高いです。配列のインデックスがUnicodeコードポイントに対応し、その値が照合要素の情報を保持していると推測されます。
これらの配列のデータが更新されたということは、UCAのデータが変更されたか、またはmaketables
ツールが以前に生成したデータに誤りがあったかのいずれかであり、今回のコミットによって照合ロジックがUnicode標準にさらに正確に準拠するようになったことを意味します。
関連リンク
- Go CL 6248067: https://golang.org/cl/6248067
参考にした情報源リンク
- この解説は、提供されたコミット情報、Go言語の
exp/locale/collate
パッケージの一般的な知識、およびUnicode Collation Algorithm (UCA)に関する一般的な理解に基づいて作成されました。