[インデックス 14259] ファイルの概要
このコミットは、Go言語のunicode
および関連パッケージをUnicode 6.2.0に更新するものです。具体的には、以下のファイルが変更されています。
src/pkg/exp/locale/collate/build/builder.go
src/pkg/exp/locale/collate/maketables.go
src/pkg/exp/locale/collate/tables.go
src/pkg/exp/norm/tables.go
src/pkg/unicode/graphic.go
src/pkg/unicode/letter.go
src/pkg/unicode/maketables.go
src/pkg/unicode/script_test.go
src/pkg/unicode/tables.go
これらのファイルは、Go言語におけるUnicode文字の処理、特に文字の分類、照合(collation)、正規化(normalization)に関連するデータテーブルや生成スクリプトを含んでいます。
コミット
- コミットハッシュ:
e14cf90a8b14c7d47aed1cfe504d7ec67890bc43
- 作者: Marcel van Lohuizen mpvl@golang.org
- 日付: Wed Oct 31 17:32:16 2012 +0100
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/e14cf90a8b14c7d47aed1cfe504d7ec67890bc43
元コミット内容
unicode: move unicode and related packages to Unicode 6.2.0.
R=r, mpvl
CC=golang-dev
https://golang.org/cl/6818067
変更の背景
このコミットの主な背景は、Go言語のUnicodeサポートを最新のUnicode標準であるUnicode 6.2.0に準拠させることです。Unicode標準は、世界中の文字体系をコンピュータで扱うための文字コードの国際標準であり、定期的に新しい文字の追加や既存の文字プロパティの変更が行われます。
プログラミング言語が最新のUnicode標準をサポートすることは、以下のような点で重要です。
- 国際化対応の強化: 新しい言語や記号が追加されることで、より多くの言語圏のユーザーがGo言語で開発されたアプリケーションを適切に利用できるようになります。
- 正確な文字処理: 文字の分類(例: 句読点、数字、文字など)、照合(文字列のソート順)、正規化(異なる表現の文字を統一する処理)などの処理が、最新の標準に基づいて正確に行われるようになります。これにより、多言語環境での文字列処理におけるバグや予期せぬ挙動を防ぐことができます。
- セキュリティの向上: Unicodeには、視覚的に似ているが異なる文字(ホモグラフ)や、特定の文字の組み合わせが悪用される可能性のあるケースが存在します。最新の標準に追従することで、これらの潜在的なセキュリティリスクに対処するための情報が更新されます。
Go 1.1のリリース(2013年)で、unicode
パッケージがUnicode 6.2.0をサポートするように更新されたことが確認されており、このコミットはその準備または一部であると考えられます。
前提知識の解説
Unicode
Unicodeは、世界中のあらゆる文字をコンピュータで一貫して表現・処理するための文字コード標準です。各文字には一意の「コードポイント」が割り当てられ、これにより異なるシステム間での文字化けを防ぎます。Unicodeは単なる文字コードだけでなく、文字のプロパティ(大文字/小文字、数字、記号など)、文字の正規化、照合順序など、文字処理に関する様々な規則を定義しています。
文字の照合 (Collation)
照合(Collation)とは、文字列を特定の順序で並べ替える(ソートする)ための規則のことです。単に文字コードの数値順に並べるだけでは、人間の言語における自然なソート順とは異なる場合があります。例えば、ドイツ語の「ä」は「a」の後に来るべきですが、文字コード順では「z」の後に来るかもしれません。Unicode Collation Algorithm (UCA) は、このような言語固有の照合規則を国際的に標準化するためのアルゴリズムです。UCAは、文字を「照合要素(Collation Element)」のシーケンスに変換し、それらを比較することでソート順を決定します。
文字の正規化 (Normalization)
Unicodeには、同じ文字を複数の異なるバイト列で表現できる場合があります。例えば、アクセント付きの文字「é」は、単一のコードポイント(U+00E9)で表現することもできますし、「e」と結合文字のアクセント記号(U+0301)の組み合わせで表現することもできます。正規化(Normalization)とは、これらの異なる表現を統一された形式に変換するプロセスです。これにより、文字列の比較や検索が正確に行えるようになります。UnicodeにはNFC、NFD、NFKC、NFKDの4つの正規化形式が定義されています。
Go言語におけるUnicodeサポート
Go言語は、設計当初からUnicodeを強力にサポートしています。
- Goの文字列はUTF-8エンコードされたバイト列として扱われます。
rune
型はUnicodeのコードポイント(UTF-32)を表すために使用され、int32
のエイリアスです。unicode
パッケージは、文字のプロパティ(数字かどうか、文字かどうかなど)や正規化に関する機能を提供します。exp/locale/collate
パッケージ(実験的パッケージ)は、Unicode Collation Algorithm (UCA) に基づく文字列の照合機能を提供します。
技術的詳細
このコミットの技術的詳細は、主にGo言語のUnicode関連パッケージが参照するデータソースの更新と、それに伴う内部データ構造の再生成にあります。
-
データソースの更新:
src/pkg/exp/locale/collate/maketables.go
ファイルでは、Unicode Collation Algorithm (UCA) のデータソースURLが変更されています。- 変更前:
http://www.unicode.org/Public/cldr/2.0.1/core.zip
- 変更後:
http://www.unicode.org/Public/cldr/22/core.zip
- 変更前:
- これは、Unicode Common Locale Data Repository (CLDR) のバージョンが2.0.1から22に更新されたことを意味します。CLDRは、ロケール(地域や言語)に特化したデータ(日付、時刻、通貨の書式、照合順序など)を提供するUnicodeのプロジェクトです。CLDRのバージョンアップは、照合順序の規則がUnicode 6.2.0に合わせて更新されたことを示唆しています。
-
データテーブルの再生成:
src/pkg/exp/locale/collate/tables.go
とsrc/pkg/exp/norm/tables.go
、そしてsrc/pkg/unicode/tables.go
は、Go言語のプログラムが実行時に使用するUnicode関連のデータテーブルを含んでいます。これらのファイルは手動で編集されるものではなく、maketables
などのツールによって自動生成されます。- コミットの差分を見ると、これらの
tables.go
ファイルの内容が大幅に変更されています。これは、maketables
スクリプトが新しいUnicode 6.2.0およびCLDR 22のデータソースを基に実行され、その結果として内部データが更新されたことを示しています。 - 具体的には、
mainExpandElem
のような内部配列のサイズが変更され(例:40567
エントリから41344
エントリへ)、それに伴い配列の内容(16進数のデータ)が大きく変化しています。これらのデータは、文字のプロパティ、照合要素、正規化マッピングなどを効率的にルックアップするためのトライ木(trie)やその他のデータ構造を構成しています。 src/pkg/unicode/graphic.go
やsrc/pkg/unicode/letter.go
のようなファイルも変更されていますが、これはunicode/tables.go
のデータ更新に伴い、文字のグラフィックプロパティや文字種(letter)の定義がUnicode 6.2.0に合わせて調整されたためと考えられます。
-
照合ロジックの微調整:
src/pkg/exp/locale/collate/build/builder.go
では、プライマリ値のチェックロジックが微調整されています。- 変更前:
else if ce[0] > 0
- 変更後:
else if ce[0] > 1 // 1 is a special primary value reserved for FFFE
- 変更前:
- これは、照合要素のプライマリ値「1」が特定の特殊な用途(FFFEという予約された値)のために確保されていることを考慮した変更であり、Unicode 6.2.0の照合規則に合わせたものです。
これらの変更は、Go言語がUnicode文字をより正確かつ最新の標準に準拠して処理できるようにするための、基盤となるデータとロジックの更新を反映しています。
コアとなるコードの変更箇所
このコミットにおけるコアとなるコードの変更箇所は以下の通りです。
-
src/pkg/exp/locale/collate/maketables.go
:--- a/src/pkg/exp/locale/collate/maketables.go +++ b/src/pkg/exp/locale/collate/maketables.go @@ -38,7 +38,7 @@ var ( `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", - "http://www.unicode.org/Public/cldr/2.0.1/core.zip", + "http://www.unicode.org/Public/cldr/22/core.zip", "URL of CLDR archive.") test = flag.Bool("test", false, "test existing tables; can be used to compare web data with package data.")
- CLDRデータソースのURLが
2.0.1
から22
に更新されています。
- CLDRデータソースのURLが
-
src/pkg/exp/locale/collate/tables.go
:--- a/src/pkg/exp/locale/collate/tables.go +++ b/src/pkg/exp/locale/collate/tables.go @@ -1,8623 +1,8789 @@ // Generated by running -// maketables -root=http://unicode.org/Public/UCA/6.0.0/CollationAuxiliary.zip -cldr=http://www.unicode.org/Public/cldr/2.0.1/core.zip +// maketables -root=http://unicode.org/Public/UCA/6.2.0/CollationAuxiliary.zip -cldr=http://www.unicode.org/Public/cldr/22/core.zip // DO NOT EDIT // TODO: implement more compact representation for sparse blocks. package collate -var availableLocales = []string{"af", "ar", "as", "az", "be", "bg", "bn", "ca", "cs", "cy", "da", "de", "dz", "el", "en_US_POSIX", "eo", "es", "et", "fa", "fi", "fil", "fo", "fr_CA", "gu", "ha", "haw", "he", "hi", "hr", "hu", "hy", "ig", "is", "ja", "kk", "kl", "km", "kn", "ko", "kok", "ln", "lt", "lv", "mk", "ml", "mr", "mt", "nb", "nn", "nso", "om", "or", "pa", "pl", "ps", "ro", "root", "ru", "se", "si", "sk", "sl", "sq", "sr", "sv", "ta", "te", "th", "tn", "tr", "uk", "ur", "vi", "wae", "yo", "zh"} +var availableLocales = []string{"af", "ar", "as", "az", "be", "bg", "bn", "ca", "cs", "cy", "da", "de", "dz", "ee", "el", "en_US_POSIX", "eo", "es", "et", "fa", "fi", "fil", "fo", "fr_CA", "gu", "ha", "haw", "he", "hi", "hr", "hu", "hy", "ig", "is", "ja", "kk", "kl", "km", "kn", "ko", "kok", "ln", "lt", "lv", "mk", "ml", "mr", "mt", "nb", "nn", "nso", "om", "or", "pa", "pl", "ps", "ro", "root", "ru", "se", "si", "sk", "sl", "sq", "sr", "sv", "ta", "te", "th", "tn", "to", "tr", "uk", "ur", "vi", "wae", "yo", "zh"} var locales = map[string]tableIndex{ "af": { - lookupOffset: 0x14, + lookupOffset: 0x15, valuesOffset: 0x0, }, "ar": { - lookupOffset: 0x16, + lookupOffset: 0x17, valuesOffset: 0x0, }, ... (以下、大量のデータ変更)
- ファイル冒頭のコメントが、
maketables
実行時の-root
と-cldr
オプションのURLがUnicode 6.2.0とCLDR 22に更新されたことを示しています。 availableLocales
配列に新しいロケール(例: "ee", "to")が追加されています。locales
マップ内の各ロケールに対するlookupOffset
やvaluesOffset
の値が変更されており、これは内部の照合データテーブルが再生成されたことを示しています。mainExpandElem
などの大規模なデータ配列の内容が大幅に変更されています。
- ファイル冒頭のコメントが、
-
src/pkg/unicode/tables.go
:- このファイルも
exp/locale/collate/tables.go
と同様に、maketables
スクリプトによって生成されるUnicodeの文字プロパティデータを含んでいます。コミットの差分では、このファイルの内容も大幅に更新されていることが示されています。これは、Unicode 6.2.0の文字プロパティデータが取り込まれた結果です。
- このファイルも
コアとなるコードの解説
src/pkg/exp/locale/collate/maketables.go
の変更
このファイルの変更は、Go言語の照合データ生成プロセスにおいて、どのバージョンのCLDRデータを使用するかを明示的に指定するものです。CLDRはUnicodeの重要な一部であり、言語ごとの照合規則を定義しています。CLDRのバージョンを2.0.1から22に更新することで、Go言語の照合機能がUnicode 6.2.0で導入された最新の照合規則とデータに準拠するようになります。これは、Go言語が多言語環境での文字列ソートをより正確に行うための基盤を更新したことを意味します。
src/pkg/exp/locale/collate/tables.go
およびsrc/pkg/unicode/tables.go
の変更
これらのファイルは、Go言語のunicode
およびexp/locale/collate
パッケージが内部的に使用する、Unicode文字に関する膨大なデータテーブルを含んでいます。これらのファイルは手動で編集されるものではなく、maketables
のような専用のツールによって、Unicodeの公式データファイルから自動生成されます。
コミットの差分でこれらのファイルの内容が大幅に変わっているのは、以下の理由によります。
- Unicode 6.2.0データの取り込み:
maketables
スクリプトがUnicode 6.2.0の文字プロパティデータ(unicode/tables.go
に影響)と、CLDR 22の照合データ(exp/locale/collate/tables.go
に影響)を読み込んで再実行されたためです。 - データ構造の最適化: これらのデータテーブルは、文字のプロパティ検索や照合要素の取得を高速に行うために、トライ木(trie)などの効率的なデータ構造で表現されています。新しいUnicodeデータを取り込むことで、これらのデータ構造のサイズ(例:
mainExpandElem
の要素数)や内部のオフセット値(例:lookupOffset
,valuesOffset
)が変化します。これは、新しい文字が追加されたり、既存の文字のプロパティや照合順序が変更されたりした結果として、データ構造が再構築されたことを示しています。
これらの変更は、Go言語がUnicodeの最新の仕様に準拠し、より正確で包括的な文字処理機能を提供するための、内部的なデータ基盤の更新を反映しています。ユーザーが直接これらのファイルを編集することは通常なく、Go言語のツールチェーンによって透過的に管理されます。
関連リンク
- Go言語の公式Issueトラッカーでの関連変更リスト: https://golang.org/cl/6818067
- GitHub上のコミットページ: https://github.com/golang/go/commit/e14cf90a8b14c7d47aed1cfe504d7ec67890bc43
参考にした情報源リンク
- Go 1.1リリースノート (Unicode 6.2.0サポートに関する言及): https://go.dev/doc/go1.1
- Go言語のUnicodeサポートに関する一般的な情報: https://go.dev/blog/strings
- Unicode Collation Algorithm (UCA) の概要: https://unicode.org/reports/tr10/
- Common Locale Data Repository (CLDR) の概要: https://cldr.unicode.org/
- Go言語の
rune
型に関する情報: https://reintech.io/blog/go-rune-type-explained - Go言語の識別子におけるUnicode文字の扱いに関する議論 (Reddit): https://www.reddit.com/r/golang/comments/101111/go_language_specification_excludes_combining/
- Go言語のUnicodeサポートに関する記事: https://marcusnoble.co.uk/2014/03/04/go-and-unicode/