[インデックス 14262] ファイルの概要
このコミットは、Go言語のsrc/lib9/utf
ディレクトリ内のUnicodeデータファイルをUnicodeバージョン6.2.0に更新するものです。具体的には、Makefile
、runetype.c
、そしてrunetypebody-6.0.0.h
からrunetypebody-6.2.0.h
へのファイル名変更と内容更新が含まれています。
コミット
- コミットハッシュ:
c15afa887a038a3f4c70f1e38aac31084ee9f846
- 作者: Rob Pike r@golang.org
- 日付: Wed Oct 31 10:52:59 2012 -0700
- コミットメッセージ:
src/lib9/utf: update to Unicode 6.2.0 Fixes #2874. R=golang-dev, rsc CC=golang-dev https://golang.org/cl/6820068
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/c15afa887a038a3f4c70f1e38aac31084ee9f846
元コミット内容
src/lib9/utf: update to Unicode 6.2.0
Fixes #2874.
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/6820068
変更の背景
このコミットの主な目的は、Go言語の内部で使用されるUnicodeデータ定義を、より新しいバージョンであるUnicode 6.2.0に更新することです。これは、Fixes #2874
という記述から、特定のバグ修正や機能改善に関連していることが示唆されます。Unicodeの新しいバージョンがリリースされると、新しい文字の追加、既存の文字プロパティの変更、スクリプトの更新などが行われます。これらの変更をGo言語の文字処理機能に反映させることで、より正確で最新の文字処理を保証し、国際化対応を強化することができます。
Unicode 6.2.0は2012年9月にリリースされ、特にトルコ・リラ記号(U+20BA TURKISH LIRA SIGN)の追加が注目されました。また、絵文字やその他の文字の改行プロパティの改善、テキストセグメンテーションの更新、NamesList.txt
のエンコーディング変更(Latin-1からUTF-8へ)なども含まれていました。これらの変更は、文字の分類(数字、アルファベット、大文字、小文字など)や、文字の変換(大文字・小文字変換)に影響を与えるため、Go言語のlib9/utf
パッケージのような文字処理ライブラリでは、これらの更新を追従する必要があります。
前提知識の解説
Unicode
Unicode(ユニコード)は、世界中のあらゆる文字を統一的に扱うための文字コードの国際標準です。異なる言語やプラットフォーム間で文字データを交換する際の互換性の問題を解決するために開発されました。各文字には一意のコードポイント(数値)が割り当てられています。
UTF (Unicode Transformation Format)
UTFは、Unicodeのコードポイントをバイト列にエンコード(符号化)するための方式です。代表的なものにUTF-8、UTF-16、UTF-32などがあります。Go言語では通常UTF-8が広く使われています。
Rune
Go言語におけるrune
型は、Unicodeのコードポイントを表すために使用される組み込み型です。これは実質的にint32
のエイリアスであり、1つのUnicode文字を表現します。string
型はUTF-8でエンコードされたバイト列のシーケンスであり、rune
のシーケンスではありません。
文字プロパティ
Unicodeの各文字には、その文字の特性を示す様々な「プロパティ」が定義されています。例えば、文字が数字であるか(IsDigit
)、アルファベットであるか(IsLetter
)、大文字であるか(IsUpper
)、小文字であるか(IsLower
)といった情報です。これらのプロパティは、テキスト処理、正規表現、言語処理などにおいて非常に重要です。
mkrunetype
mkrunetype
は、Unicodeの公式データファイル(例: UnicodeData.txt
)を読み込み、Go言語のlib9/utf
パッケージが利用する形式のC言語ヘッダーファイル(例: runetypebody-X.Y.Z.h
)を生成するためのツールです。このツールは、Unicodeの文字プロパティに基づいて、文字の範囲や特性を定義する静的配列を生成します。これにより、Go言語のランタイムが効率的に文字プロパティをルックアップできるようになります。
runetypebody-X.Y.Z.h
このファイルは、mkrunetype
によって生成されるヘッダーファイルで、特定のUnicodeバージョン(X.Y.Z)に対応する文字プロパティデータを含んでいます。このファイルには、__isspacer
、__isdigitr
、__isalphar
、__isupperp
、__islowerr
などの静的配列が含まれており、それぞれが特定の文字プロパティを持つUnicodeコードポイントの範囲を定義しています。
技術的詳細
このコミットは、Go言語の文字処理ライブラリが依存するUnicodeデータファイルを更新するプロセスを示しています。
-
バージョン番号の更新:
src/lib9/utf/Makefile
内で定義されているUNICODE_VERSION
変数が6.0.0
から6.2.0
に更新されています。これは、ビルドプロセスが新しいバージョンのUnicodeデータを使用するように指示します。 -
生成されるヘッダーファイル名の変更:
Makefile
内のrunetypebody-%.c
ターゲットがrunetypebody-%.h
に変更されています。これは、生成されるファイルがC言語のソースファイルではなく、ヘッダーファイルであることを明確にするための変更です。また、runetype.c
内でインクルードされるヘッダーファイル名もrunetypebody-6.0.0.h
からrunetypebody-6.2.0.h
に更新されています。 -
Unicodeデータファイルの更新: 最も重要な変更は、
src/lib9/utf/runetypebody-6.0.0.h
がsrc/lib9/utf/runetypebody-6.2.0.h
にリネームされ、その内容がUnicode 6.2.0のデータに基づいて更新されたことです。このファイルはmkrunetype
ツールによって生成されるものであり、手動で編集されるものではありません。コミットの差分を見ると、__isdigitr
、__isalphar
、__isalphas
、__isupperp
、__isuppers
、__islowerr
、__islowerp
、__islowers
、__istitlep
、__istitles
、__toupperp
、__touppers
、__tolowerp
、__tolowers
、__totitlep
、__totitles
といった静的配列に、新しいUnicode文字の範囲が追加されたり、既存の範囲が修正されたりしていることがわかります。例えば、
__isdigitr
配列には、新しい数字の範囲(例:0x110f0, 0x110f9
)が追加されています。これは、Unicode 6.2.0で追加された新しい数字文字ブロックに対応するためです。同様に、__isalphar
やその他のプロパティ配列にも、新しいアルファベット文字やその他の文字プロパティの変更が反映されています。
この更新により、Go言語のlib9/utf
パッケージは、Unicode 6.2.0で定義された最新の文字プロパティと文字範囲を正確に認識し、それに基づいて文字の分類、大文字・小文字変換などの操作を実行できるようになります。
コアとなるコードの変更箇所
このコミットで変更された主要なファイルは以下の3つです。
-
src/lib9/utf/Makefile
:--- a/src/lib9/utf/Makefile +++ b/src/lib9/utf/Makefile @@ -15,13 +15,13 @@ UnicodeData-%.txt: mkrunetype: mkrunetype.c cc -I../../../include -o mkrunetype -L$(GOROOT)/pkg/obj/$(GOOS)_$(GOARCH)/ mkrunetype.c -l9 -runetypebody-%.c: mkrunetype UnicodeData-%.txt +runetypebody-%.h: mkrunetype UnicodeData-%.txt mkrunetype -p UnicodeData-$*.txt >_$@ mv _$@ $@ CLEANFILES+=UnicodeData.txt -UNICODE_VERSION=6.0.0 +UNICODE_VERSION=6.2.0 test: mkrunetype UnicodeData-$(UNICODE_VERSION).txt mkrunetype -c UnicodeData-$(UNICODE_VERSION).txt
-
src/lib9/utf/runetype.c
:--- a/src/lib9/utf/runetype.c +++ b/src/lib9/utf/runetype.c @@ -35,4 +35,4 @@ rbsearch(Rune c, Rune *t, int n, int ne) return 0; } -#include "runetypebody-6.0.0.h" +#include "runetypebody-6.2.0.h"
-
src/lib9/utf/runetypebody-6.0.0.h
からsrc/lib9/utf/runetypebody-6.2.0.h
へのリネームと内容変更: このファイルはリネームされ、その内容が大幅に更新されています。差分は非常に大きいため、ここでは一部の例のみを示します。- ファイル名変更:
src/lib9/utf/runetypebody-6.0.0.h
->src/lib9/utf/runetypebody-6.2.0.h
- 内容変更の例 (
__isdigitr
の追加):--- a/src/lib9/utf/runetypebody-6.0.0.h +++ b/src/lib9/utf/runetypebody-6.2.0.h @@ -64,6 +64,10 @@ static Rune __isdigitr[] = { 0xff10, 0xff19, 0x104a0, 0x104a9, 0x11066, 0x1106f, +\t0x110f0, 0x110f9, +\t0x11136, 0x1113f, +\t0x111d0, 0x111d9, +\t0x116c0, 0x116c9, 0x1d7ce, 0x1d7ff, };
- 内容変更の例 (
__isalphar
の修正):--- a/src/lib9/utf/runetypebody-6.0.0.h +++ b/src/lib9/utf/runetypebody-6.2.0.h @@ -189,7 +194,7 @@ static Rune __isalphar[] = { 0x0ead, 0x0eb0, 0x0eb2, 0x0eb3, 0x0ec0, 0x0ec4, -\t0x0edc, 0x0edd, +\t0x0edc, 0x0edf, 0x0f40, 0x0f47, 0x0f49, 0x0f6c, 0x0f88, 0x0f8c,
- ファイル名変更:
コアとなるコードの解説
-
src/lib9/utf/Makefile
の変更:UNICODE_VERSION=6.0.0
をUNICODE_VERSION=6.2.0
に変更することで、ビルドシステムがUnicode 6.2.0のデータを使用するように設定されます。runetypebody-%.c
をrunetypebody-%.h
に変更することで、mkrunetype
ツールが生成するファイルの拡張子が.c
から.h
に変わります。これは、生成されるファイルがC言語のソースコードの一部ではなく、ヘッダーファイルとしてインクルードされることをより正確に反映しています。
-
src/lib9/utf/runetype.c
の変更:#include "runetypebody-6.0.0.h"
を#include "runetypebody-6.2.0.h"
に変更することで、runetype.c
が新しいバージョンのUnicodeデータを含むヘッダーファイルをインクルードするようになります。これにより、Go言語の文字処理関数が最新のUnicodeプロパティ定義を利用できるようになります。
-
src/lib9/utf/runetypebody-6.0.0.h
からsrc/lib9/utf/runetypebody-6.2.0.h
へのリネームと内容変更:- このファイルは、
mkrunetype
ツールによってUnicode 6.2.0のデータから自動生成されたものです。 - ファイル内の
static Rune __isspacer[]
、static Rune __isdigitr[]
、static Rune __isalphar[]
などの配列は、それぞれスペース文字、数字文字、アルファベット文字などのUnicodeコードポイントの範囲を定義しています。 - 差分に見られるように、これらの配列にはUnicode 6.2.0で追加された新しい文字や、既存の文字のプロパティ変更が反映されています。例えば、
__isdigitr
に新しい数字の範囲が追加されたり、__isalphar
の既存の範囲が拡張されたりしています。 - これらの変更により、Go言語の
unicode
パッケージ(およびその基盤となるlib9/utf
)は、Unicode 6.2.0の仕様に完全に準拠し、より多くの文字セットと正確な文字プロパティ情報に基づいて文字処理を行うことができるようになります。これは、特に国際化されたアプリケーションにおいて、文字の正確な分類、大文字・小文字変換、正規化などの機能を提供する上で不可欠です。
- このファイルは、
関連リンク
- Go CL (Code Review) リンク: https://golang.org/cl/6820068
- Go Issue #2874: https://go.dev/issue/2874 (このコミットが修正したイシュー)