Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 14256] ファイルの概要

このコミットは、Go言語の実験的なロケールパッケージ exp/locale/collate 内の maketables.go ファイルに対する変更です。具体的には、照合(collation)テーブルを生成する際に、エントリにコンテキスト情報を追加する修正が行われています。

コミット

exp/locale/collate: エントリにコンテキストを追加。

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/bc0783dbe5c0b1319843f9a97df946549a24b7b1

元コミット内容

exp/locale/collate: add context to entry.

R=r
CC=golang-dev
https://golang.org/cl/6727049

変更の背景

この変更は、Go言語の実験的なロケールパッケージ exp/locale/collate における照合(collation)ルールの処理を改善するために導入されました。照合とは、文字列を特定の言語や文化の規則に従ってソートするプロセスです。Unicode Collation Algorithm (UCA) は、この照合のための標準的なアルゴリズムを提供しますが、特定の言語やユーザーのニーズに合わせてカスタマイズ(テーラリング)することが可能です。

以前の実装では、照合ルールを挿入する際に、特定の文字列とその拡張情報のみを考慮していました。しかし、より複雑な照合ルール、特に文脈依存の照合(例: ある文字が特定の文字の後に続く場合にのみ異なるソート順を持つ)を正確に処理するためには、そのルールが適用される「コンテキスト」情報が必要となります。

このコミットは、build.TailoringInsert メソッドに渡される引数に context を追加することで、この文脈依存の照合ルールを適切に処理できるようにすることを目的としています。これにより、より正確で柔軟な照合テーブルの生成が可能になります。

前提知識の解説

照合 (Collation)

照合とは、文字列を特定の順序で並べ替えるプロセスです。これは単に文字コードの順序で並べるだけでなく、言語や文化に固有のルール(例: アクセント記号付きの文字、合字、大文字と小文字の扱い、数字のソート順など)を考慮に入れます。

Unicode Collation Algorithm (UCA)

UCAは、Unicode Consortiumによって定義された、多言語環境での文字列照合のための標準アルゴリズムです。UCAは、各文字に照合要素(collation element)と呼ばれる重みを割り当てることで、言語に依存しない基本的な照合順序を提供します。

テーラリング (Tailoring)

UCAは一般的な照合順序を提供しますが、特定の言語やユーザーのニーズに合わせてカスタマイズすることができます。このカスタマイズプロセスを「テーラリング」と呼びます。テーラリングでは、特定の文字や文字列の照合順序を変更したり、新しい照合ルールを追加したりします。例えば、ドイツ語の「ä」を「a」と「e」の間にソートしたり、スウェーデン語の「å」を「z」の後にソートしたりするなどのルールがテーラリングによって定義されます。

exp/locale/collate パッケージ

Go言語の exp/locale/collate パッケージは、UCAに基づいた照合機能を提供するための実験的なパッケージです。このパッケージは、照合テーブルの生成や、それを利用した文字列のソート機能を提供することを目的としています。

build.Tailoring

build.Tailoring は、照合テーラリングルールを構築するための構造体です。この構造体は、特定の言語やロケールに合わせた照合順序を定義するためのメソッドを提供します。Insert メソッドは、このテーラリングに新しい照合ルールを挿入するために使用されます。

技術的詳細

このコミットの核心は、build.Tailoring 構造体の Insert メソッドの呼び出し方に context 引数を追加した点にあります。

src/pkg/exp/locale/collate/maketables.go ファイルは、照合テーブルを生成するためのGoプログラムです。このファイル内の insertTailoring 関数は、特定の照合ルールを build.Tailoring オブジェクトに挿入する役割を担っています。

変更前は、t.Insert(level, str, extend) のように、照合レベル、文字列、および拡張情報のみを渡していました。ここで extend は、照合要素の拡張(例: ある文字が別の文字の後に続く場合に、その文字の照合要素をどのように変更するか)を定義するものです。

しかし、文脈依存の照合ルールを正確に表現するためには、str がどの「コンテキスト」で現れるかという情報も必要になります。例えば、ある文字が特定のプレフィックスやサフィックスを持つ場合にのみ、その照合順序が変わるようなケースです。

このコミットでは、insertTailoring 関数が受け取る context 引数を、t.Insert メソッドの extend 引数に結合して渡すように変更されました。具体的には、context + extend という形で渡されます。これにより、Insert メソッドは、挿入される照合ルールが適用される文脈を認識できるようになり、より複雑なテーラリングルールを正確に処理することが可能になります。

この変更は、照合テーブルの精度と柔軟性を向上させ、より多様な言語の照合要件に対応するための重要なステップです。

コアとなるコードの変更箇所

--- a/src/pkg/exp/locale/collate/maketables.go
+++ b/src/pkg/exp/locale/collate/maketables.go
@@ -607,7 +607,7 @@ func insertTailoring(t *build.Tailoring, r RuleElem, context, extend string) {
     		if *test {
     			testInput.add(str)
     		}
    -		err := t.Insert(lmap[l[0]], str, extend)
    +		err := t.Insert(lmap[l[0]], str, context+extend)
     		failOnError(err)
     	}
     case "pc", "sc", "tc", "ic":
    @@ -617,7 +617,7 @@ func insertTailoring(t *build.Tailoring, r RuleElem, context, extend string) {
     		if *test {
     			testInput.add(str)
     		}
    -		err := t.Insert(level, str, extend)
    +		err := t.Insert(level, str, context+extend)
     		failOnError(err)
     	}
     default:

コアとなるコードの解説

変更は src/pkg/exp/locale/collate/maketables.go ファイル内の insertTailoring 関数に集中しています。

この関数は、照合ルール要素 r、コンテキスト文字列 context、および拡張文字列 extend を受け取り、これらを build.Tailoring オブジェクト t に挿入します。

変更前は、t.Insert メソッドの第3引数に extend のみが渡されていました。

err := t.Insert(lmap[l[0]], str, extend)

および

err := t.Insert(level, str, extend)

変更後は、contextextend を結合した文字列 context+extend が第3引数として渡されるようになりました。

err := t.Insert(lmap[l[0]], str, context+extend)

および

err := t.Insert(level, str, context+extend)

この変更により、build.Tailoring.Insert メソッドは、挿入される照合ルールが適用される際に考慮すべき「コンテキスト」情報を追加で受け取ることができるようになりました。これにより、例えば「特定の文字の前に特定の文字がある場合にのみ、その文字の照合順序を変更する」といった、より複雑で文脈依存の照合ルールを正確に定義し、照合テーブルに反映させることが可能になります。

関連リンク

  • Go CL 6727049: https://golang.org/cl/6727049
  • Unicode Collation Algorithm (UCA): https://unicode.org/reports/tr10/
  • Go言語の exp/locale パッケージに関する情報 (当時の実験的な性質を考慮): Goの公式ドキュメントやGoのソースコードリポジトリで exp/locale/collate を検索すると、より詳細な情報が見つかる可能性があります。

参考にした情報源リンク

  • Go CL 6727049 の内容
  • Unicode Collation Algorithm (UCA) の概念に関する一般的な知識
  • Go言語のパッケージ構造と実験的なパッケージの慣習に関する一般的な知識
  • build.Tailoring および Insert メソッドの機能に関する推測(当時のコードベースとGoの設計原則に基づく)
  • Go言語のソースコードリポジトリ (GitHub)
  • Go言語の公式ドキュメント (当時のバージョン)