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

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

このコミットでは、src/pkg/exp/locale/collate/maketables.gosrc/pkg/exp/locale/collate/tables.go の2つのファイルが変更されています。これらのファイルは、Go言語の実験的なロケールパッケージにおける照合(collation)テーブルの生成と定義に関連しています。

コミット

  • Author: Marcel van Lohuizen mpvl@golang.org
  • Date: Sat Sep 8 10:38:11 2012 +0900
  • Commit Hash: 21d94a22fe0a1189468b3c8ad91e379a348e9c39

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

https://github.com/golang/go/commit/21d94a22fe0a1189468b3c8ad91e379a348e9c39

元コミット内容

    exp/locale/collate: switch from DUCET to CLDR for the default root table.
    
    R=r
    CC=golang-dev
    https://golang.org/cl/6499079

変更の背景

このコミットの主な目的は、Go言語の実験的なロケールパッケージの照合機能において、デフォルトのルートテーブルのデータソースをDUCET (Default Unicode Collation Element Table) からCLDR (Common Locale Data Repository) に切り替えることです。

Unicode Collation Algorithm (UCA) は、文字列のソート順を定義するための標準です。DUCETはUCAの一部として、すべてのUnicode文字に対するデフォルトの照合順序を提供します。これは言語に依存しない普遍的なソート順であり、多言語テキストや特定の言語設定が不明な場合に有用です。

しかし、実際の言語におけるソート順は、文化や地域によって大きく異なります。例えば、ドイツ語とスウェーデン語では「ä」のソート順が異なる場合があります。CLDRは、このような言語固有の照合ルールやカスタマイズ(「テーラリング」と呼ばれる)を提供します。CLDRのルート照合要素テーブルはDUCETを基盤としており、その上に特定の言語や地域に合わせたルールが追加されています。

この変更は、Go言語の照合機能がより現実的で、言語固有のソート要件に対応できるようにするためのものです。DUCETのみを使用するのではなく、CLDRのデータを利用することで、より正確で文化的に適切な文字列のソートが可能になります。

前提知識の解説

Unicode Collation Algorithm (UCA)

UCAは、Unicode文字列を比較し、ソート順を決定するための国際標準アルゴリズムです。異なる言語やロケールで一貫したソート結果を得ることを目的としています。UCAは、文字の重み付け(プライマリ、セカンダリ、ターシャリなど)に基づいて比較を行います。

DUCET (Default Unicode Collation Element Table)

DUCETは、UCAの主要なデータテーブルであり、すべてのUnicode文字に対するデフォルトの照合要素(collation element)を定義しています。これは、文字の基本的なソート順を決定するための基盤となります。DUCETは、特定の言語やロケールに依存しない、普遍的なソート順を提供します。

CLDR (Common Locale Data Repository)

CLDRは、Unicode Consortiumが提供する、ロケール固有のデータの大規模なコレクションです。これには、日付、時刻、通貨の書式設定、言語名、国名、そして照合ルールなどが含まれます。CLDRの照合データは、DUCETをベースとしていますが、各言語やロケールに特有のソート順のカスタマイズ(テーラリング)が施されています。これにより、例えばドイツ語のウムラウトやスペイン語の「ñ」など、特定の言語で特殊なソート順を持つ文字が正しく扱われるようになります。

DUCETとCLDRの関係

DUCETは、Unicode文字のデフォルトの照合順序を定義する「基盤」です。一方、CLDRは、そのDUCETを「カスタマイズ」し、特定の言語や地域に合わせた照合ルールを提供するものです。CLDRの照合ルールは、DUCETからの最小限の変更で構成されており、データサイズとパフォーマンスへの影響を最小限に抑えるように設計されています。

技術的詳細

このコミットは、Go言語のexp/locale/collateパッケージが、照合テーブルを生成する際に使用するデータソースを変更するものです。具体的には、maketables.goで定義されているデフォルトのルートテーブルのURLが変更され、それに伴いtables.goで生成されるデータが更新されています。

以前は、allkeys.txtというDUCETのデータファイルが直接使用されていました。このファイルは、Unicode Collation Algorithmのデフォルトの照合要素を定義しています。

今回の変更では、データソースがCollationAuxiliary.zipというCLDR関連のデータを含むZIPファイルに変更されました。このZIPファイルには、CLDRの照合ルールが適用されたallkeys_CLDR.txtのようなファイルが含まれていると推測されます。これにより、生成される照合テーブルは、DUCETのデフォルト順序だけでなく、CLDRによって定義された言語固有のテーラリングも考慮したものになります。

tables.goファイルは、maketables.goによって生成されるGoのソースコードであり、照合に必要なデータ(展開要素、契約要素など)をGoのデータ構造として保持しています。データソースの変更に伴い、このファイルの内容が大幅に更新されています。具体的には、rootExpandElemrootContractElemという配列のデータが変更されており、これは照合ロジックのコアとなる部分です。これらの配列のサイズもわずかに変更されており、新しいデータセットが反映されていることがわかります。

この変更により、Goの照合機能は、より国際化されたアプリケーションの要件を満たすために、より正確で文化的に適切なソート順を提供できるようになります。

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

src/pkg/exp/locale/collate/maketables.go

--- a/src/pkg/exp/locale/collate/maketables.go
+++ b/src/pkg/exp/locale/collate/maketables.go
@@ -33,9 +33,8 @@ import (
 )
 
 var (
-// TODO: change default to "http://unicode.org/Public/UCA/"+unicode.Version+"/CollationAuxiliary.zip"
+	// TODO: change default to "http://unicode.org/Public/UCA/"+unicode.Version+"/CollationAuxiliary.zip"
 	root = flag.String("root",
-\t\t"http://unicode.org/Public/UCA/"+unicode.Version+"/allkeys.txt",
+\t\t"http://unicode.org/Public/UCA/"+unicode.Version+"/CollationAuxiliary.zip",
 		`URL of the Default Unicode Collation Element Table (DUCET). This can be a zip
 file containing the file allkeys_CLDR.txt or an allkeys.txt file.`)\
 	cldr = flag.String("cldr",
  • rootフラグのデフォルトURLがallkeys.txtからCollationAuxiliary.zipに変更されました。これは、照合テーブル生成の入力データソースがDUCETの生データからCLDRの補助データを含むZIPファイルに切り替わったことを意味します。

src/pkg/exp/locale/collate/tables.go

--- a/src/pkg/exp/locale/collate/tables.go
+++ b/src/pkg/exp/locale/collate/tables.go
@@ -1,5 +1,5 @@
 // Generated by running
-//  maketables -root=file:///Users/mpvl/Projects/go/hg/gopub/src/pkg/exp/locale/collate/allkeys.txt -cldr=file:///Users/mpvl/Projects/go/hg/gopub/src/pkg/exp/locale/collate/core.zip
+//  maketables -root=http://unicode.org/Public/UCA/6.0.0/CollationAuxiliary.zip -cldr=http://www.unicode.org/Public/cldr/2.0.1/core.zip
 // DO NOT EDIT
 // TODO: implement more compact representation for sparse blocks.
 
@@ -23,343 +23,343 @@ var rootTable = table{
 	contractTrieSet(rootCTEntries[:]),
 	rootContractElem[:],\n 	9,\n-\t0x1560,\n+\t0x2ED,\n }\n \n-// rootExpandElem: 4630 entries, 18520 bytes
-// rootExpandElem: 4642 entries, 18568 bytes
-var rootExpandElem = [4630]uint32{\n+var rootExpandElem = [4642]uint32{\n \t// Block 0, offset 0x0\n \t0x00000002, 0x8000A31A, 0x8000AD1A, 0x00000002, 0x8000A51A, 0x8000AD1A,\n \t0x00000002, 0x8000A718, 0x8000AD18, 0x00000002, 0x8000A71A, 0x8000AD1A,\n \t0x00000002, 0x8000A918, 0x8000AD18, 0x00000002, 0x8000A91A, 0x8000AD1A,\n \t0x00000002, 0x8000AB18, 0x8000AD18, 0x00000002, 0x8000AB1A, 0x8000AD1A,\n-\t0x00000002, 0x8000AD1A, 0x8000BD1A, 0x00000002, 0x40156C20, 0x80014E02,\n-\t0x00000002, 0x40156D20, 0x80014E02, 0x00000002, 0x40159920, 0x80016502,\n-\t0x00000002, 0x40159920, 0x80016602, 0x00000002, 0x40159920, 0x80016802,\n-\t0x00000002, 0x40159920, 0x80016A02, 0x00000002, 0x40159920, 0x80016B02,\n-\t0x00000002, 0x40159920, 0x80016C02, 0x00000002, 0x40159920, 0x80016D02,\n-\t0x00000002, 0x40159920, 0x80016E02, 0x00000002, 0x40159920, 0x80016F02,\n-\t0x00000002, 0x40159920, 0x80017002, 0x00000002,\n+\t0x00000002, 0x8000AD1A, 0x8000BD1A, 0x00000002, 0x40139D20, 0x80014E02,\n+\t0x00000002, 0x40139E20, 0x80014E02, 0x00000002, 0x40149A20, 0x80016502,\n+\t0x00000002, 0x40149A20, 0x80016602, 0x00000002, 0x40149A20, 0x80016802,\n+\t0x00000002, 0x40149A20, 0x80016A02, 0x00000002, 0x40149A20, 0x80016B02,\n+\t0x00000002, 0x40149A20, 0x80016C02, 0x00000002, 0x40149A20, 0x80016D02,\n+\t0x00000002, 0x40149A20, 0x80016E02, 0x00000002, 0x40149A20, 0x80016F02,\n+\t0x00000002, 0x40149A20, 0x80017002, 0x00000002,\n \t// Block 1, offset 0x40\n-\t0x40159920, 0x80017102, 0x00000002, 0x40159920, 0x80017102, 0x00000002,\n-\t0x40159920, 0x80017202, 0x00000002, 0x40159920, 0x80017302, 0x00000002,\n-\t0x40159920, 0x80017402, 0x00000002, 0x40159920, 0x80017502, 0x00000002,\n-\t0x40159920, 0x80017602, 0x00000002, 0x40159920, 0x80017702, 0x00000002,\n-\t0x40159920, 0x80017802, 0x00000002, 0x40159920, 0x80017902, 0x00000002,\n-\t0x40159920, 0x80017A02, 0x00000002, 0x40159920, 0x80017B02, 0x00000002,\n-\t0x40159920, 0x80017C02, 0x00000002, 0x002B3204, 0x80017C04, 0x00000002,\n-\t0x40159920, 0x80017D02, 0x00000002, 0x40159920, 0x80017E02, 0x00000002,\n-\t0x40159920, 0x80017F02, 0x00000002, 0x40159920, 0x80018002, 0x00000002,\n-\t0x40159920, 0x80018102, 0x00000002, 0x40159920, 0x80018202, 0x00000002,\n-\t0x40159920, 0x80018302, 0x00000002, 0x40159920,\n+\t0x40149A20, 0x80017102, 0x00000002, 0x40149A20, 0x80017102, 0x00000002,\n+\t0x40149A20, 0x80017202, 0x00000002, 0x40149A20, 0x80017302, 0x00000002,\n+\t0x40149A20, 0x80017402, 0x00000002, 0x40149A20, 0x80017502, 0x00000002,\n+\t0x40149A20, 0x80017602, 0x00000002, 0x40149A20, 0x80017702, 0x00000002,\n+\t0x40149A20, 0x80017802, 0x00000002, 0x40149A20, 0x80017902, 0x00000002,\n+\t0x40149A20, 0x80017A02, 0x00000002, 0x40149A20, 0x80017B02, 0x00000002,\n+\t0x40149A20, 0x80017C02, 0x00000002, 0x00293404, 0x80017C04, 0x00000002,\n+\t0x40149A20, 0x80017D02, 0x00000002, 0x40149A20, 0x80017E02, 0x00000002,\n+\t0x40149A20, 0x80017F02, 0x00000002, 0x40149A20, 0x80018002, 0x00000002,\n+\t0x40149A20, 0x80018102, 0x00000002, 0x40149A20, 0x80018202, 0x00000002,\n+\t0x40149A20, 0x80018302, 0x00000002, 0x40149A20,\n \t// Block 2, offset 0x80
... (以下、`tables.go`の変更はデータの内容が大量にあるため省略。変更の概要は後述の「コアとなるコードの解説」で説明します。)
  • tables.goの冒頭のコメントが更新され、maketablesコマンドの実行例が新しいURLを指すように変更されています。
  • rootTable構造体の0x1560という値が0x2EDに変更されています。これは、照合テーブルの内部的なオフセットやサイズを示す値であり、データソースの変更に伴って更新されたものです。
  • rootExpandElemrootContractElemという2つの大きなuint32配列のデータが大幅に変更されています。これらの配列のサイズもわずかに変更されています(rootExpandElemは4630エントリから4642エントリに、rootContractElemは797エントリから799エントリに)。

コアとなるコードの解説

maketables.goの変更

maketables.goは、Go言語の照合テーブルを生成するためのツールです。このファイル内のrootというflag.String変数は、DUCETデータソースのURLを定義しています。

変更前:

	root = flag.String("root",
		"http://unicode.org/Public/UCA/"+unicode.Version+"/allkeys.txt",
		`URL of the Default Unicode Collation Element Table (DUCET). This can be a zip
file containing the file allkeys_CLDR.txt or an allkeys.txt file.`)

変更後:

	root = flag.String("root",
		"http://unicode.org/Public/UCA/"+unicode.Version+"/CollationAuxiliary.zip",
		`URL of the Default Unicode Collation Element Table (DUCET). This can be a zip
file containing the file allkeys_CLDR.txt or an allkeys.txt file.`)

この変更は、maketablesツールがデフォルトでDUCETの生データファイル(allkeys.txt)ではなく、CLDRの補助データを含むZIPファイル(CollationAuxiliary.zip)をダウンロードして使用するように指示しています。コメントにもあるように、このZIPファイルはallkeys_CLDR.txtを含むことができ、これがCLDRベースの照合データを提供します。これにより、生成される照合テーブルがCLDRのテーラリングを反映したものになります。

tables.goの変更

tables.goは、maketables.goツールによって自動生成されるファイルであり、Goの照合エンジンが実行時に使用する静的なデータテーブルを含んでいます。このファイルは手動で編集すべきではありません(DO NOT EDITというコメントがあります)。

このコミットにおけるtables.goの変更は、maketables.goのデータソース変更の結果として発生したものです。

  • 生成コマンドの更新: ファイル冒頭のコメントで示されている生成コマンドが、新しいURLを反映するように更新されています。これは、このファイルが実際に新しいデータソースから生成されたことを示しています。
  • rootTableの変更: rootTable構造体内のマジックナンバーのような値(0x1560から0x2ED)が変更されています。これは、新しいデータセットの構造やサイズに合わせて、内部的なポインタやオフセットが調整されたことを示唆しています。
  • rootExpandElemrootContractElemのデータ更新: これらの配列は、Unicode文字の照合要素の展開(expansion)と契約(contraction)に関するデータを保持しています。展開は、例えばドイツ語の「ä」が「ae」として扱われるように、単一の文字が複数の照合要素に分解される場合に使用されます。契約は、例えばチェコ語の「ch」が単一の照合要素として扱われるように、複数の文字が単一の照合要素に結合される場合に使用されます。
    • rootExpandElemのサイズが4630エントリから4642エントリに増加し、rootContractElemのサイズが797エントリから799エントリに増加しています。これは、CLDRのデータがDUCETのデータと比較して、展開や契約が必要な文字の組み合わせがわずかに増えたことを示しています。
    • 配列内の具体的なuint32値が大量に変更されています。これらの値は、各Unicodeコードポイントに対応する照合要素の重みや、展開・契約のルールをエンコードしたものです。CLDRのテーラリングが適用されたことで、これらの重みやルールが更新され、より言語固有のソート順が反映されるようになりました。

これらの変更により、Goの照合機能は、より広範な言語のソート要件に対応できるようになり、国際化されたアプリケーションでの文字列処理の正確性が向上します。

関連リンク

  • https://golang.org/cl/6499079

参考にした情報源リンク