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

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

このコミットは、Go言語のsrc/lib9/utfディレクトリ内のUnicodeデータファイルをUnicodeバージョン6.2.0に更新するものです。具体的には、Makefilerunetype.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データファイルを更新するプロセスを示しています。

  1. バージョン番号の更新: src/lib9/utf/Makefile内で定義されているUNICODE_VERSION変数が6.0.0から6.2.0に更新されています。これは、ビルドプロセスが新しいバージョンのUnicodeデータを使用するように指示します。

  2. 生成されるヘッダーファイル名の変更: Makefile内のrunetypebody-%.cターゲットがrunetypebody-%.hに変更されています。これは、生成されるファイルがC言語のソースファイルではなく、ヘッダーファイルであることを明確にするための変更です。また、runetype.c内でインクルードされるヘッダーファイル名もrunetypebody-6.0.0.hからrunetypebody-6.2.0.hに更新されています。

  3. Unicodeデータファイルの更新: 最も重要な変更は、src/lib9/utf/runetypebody-6.0.0.hsrc/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つです。

  1. 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
    
  2. 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"
    
  3. 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,
      

コアとなるコードの解説

  1. src/lib9/utf/Makefile の変更:

    • UNICODE_VERSION=6.0.0UNICODE_VERSION=6.2.0 に変更することで、ビルドシステムがUnicode 6.2.0のデータを使用するように設定されます。
    • runetypebody-%.crunetypebody-%.h に変更することで、mkrunetypeツールが生成するファイルの拡張子が.cから.hに変わります。これは、生成されるファイルがC言語のソースコードの一部ではなく、ヘッダーファイルとしてインクルードされることをより正確に反映しています。
  2. src/lib9/utf/runetype.c の変更:

    • #include "runetypebody-6.0.0.h"#include "runetypebody-6.2.0.h" に変更することで、runetype.cが新しいバージョンのUnicodeデータを含むヘッダーファイルをインクルードするようになります。これにより、Go言語の文字処理関数が最新のUnicodeプロパティ定義を利用できるようになります。
  3. 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の仕様に完全に準拠し、より多くの文字セットと正確な文字プロパティ情報に基づいて文字処理を行うことができるようになります。これは、特に国際化されたアプリケーションにおいて、文字の正確な分類、大文字・小文字変換、正規化などの機能を提供する上で不可欠です。

関連リンク

参考にした情報源リンク