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

[インデックス 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標準をサポートすることは、以下のような点で重要です。

  1. 国際化対応の強化: 新しい言語や記号が追加されることで、より多くの言語圏のユーザーがGo言語で開発されたアプリケーションを適切に利用できるようになります。
  2. 正確な文字処理: 文字の分類(例: 句読点、数字、文字など)、照合(文字列のソート順)、正規化(異なる表現の文字を統一する処理)などの処理が、最新の標準に基づいて正確に行われるようになります。これにより、多言語環境での文字列処理におけるバグや予期せぬ挙動を防ぐことができます。
  3. セキュリティの向上: 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関連パッケージが参照するデータソースの更新と、それに伴う内部データ構造の再生成にあります。

  1. データソースの更新:

    • 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に合わせて更新されたことを示唆しています。
  2. データテーブルの再生成:

    • src/pkg/exp/locale/collate/tables.gosrc/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.gosrc/pkg/unicode/letter.goのようなファイルも変更されていますが、これはunicode/tables.goのデータ更新に伴い、文字のグラフィックプロパティや文字種(letter)の定義がUnicode 6.2.0に合わせて調整されたためと考えられます。
  3. 照合ロジックの微調整:

    • 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文字をより正確かつ最新の標準に準拠して処理できるようにするための、基盤となるデータとロジックの更新を反映しています。

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

このコミットにおけるコアとなるコードの変更箇所は以下の通りです。

  1. 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に更新されています。
  2. 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マップ内の各ロケールに対するlookupOffsetvaluesOffsetの値が変更されており、これは内部の照合データテーブルが再生成されたことを示しています。
    • mainExpandElemなどの大規模なデータ配列の内容が大幅に変更されています。
  3. 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言語のツールチェーンによって透過的に管理されます。

関連リンク

参考にした情報源リンク