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

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

このコミットは、Go言語のランタイムの一部であるlib9/utfライブラリにおけるUnicodeバージョンの更新に関するものです。具体的には、Unicodeのデータバージョンを6.2.0から6.3.0に引き上げています。これにより、Goの文字処理が最新のUnicode標準に準拠するようになります。

コミット

commit 29d7bbcb166a60276ad83e0b15c121c47003c556
Author: Rob Pike <r@golang.org>
Date:   Tue Feb 25 17:49:32 2014 -0800

    lib9/utf: bring C environment up to Unicode 6.3.0
    
    LGTM=bradfitz
    R=golang-codereviews, bradfitz
    CC=golang-codereviews
    https://golang.org/cl/68820043

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

https://github.com/golang/go/commit/29d7bbcb166a60276ad83e0b15c121c47003c556

元コミット内容

lib9/utf: bring C environment up to Unicode 6.3.0

LGTM=bradfitz
R=golang-codereviews, bradfitz
CC=golang-codereviews
https://golang.org/cl/68820043

変更の背景

このコミットの背景には、Go言語のランタイムが扱う文字エンコーディングと文字プロパティに関する正確性の維持があります。Unicodeは、世界中の文字を統一的に扱うための標準であり、定期的に新しいバージョンがリリースされ、新しい文字の追加、既存の文字プロパティの変更、スクリプトの更新などが行われます。

Go言語のような多言語対応を重視するプログラミング言語において、Unicode標準への準拠は非常に重要です。特に、文字の分類(例:数字、文字、空白文字など)、大文字・小文字変換、正規化、テキストのレンダリングなど、様々な文字処理機能がUnicodeデータに依存しています。古いUnicodeデータを使用し続けると、新しい文字が正しく扱えなかったり、既存の文字のプロパティが最新の標準と異なったりする問題が発生する可能性があります。

このコミットは、lib9/utfというGoランタイム内部のC言語で書かれたUTF-8処理ライブラリが、最新のUnicode 6.3.0データを使用するように更新することを目的としています。これにより、GoプログラムがUnicode文字をより正確かつ最新の標準に則って処理できるようになります。

前提知識の解説

Unicode

Unicodeは、世界中のあらゆる文字をコンピュータで扱うための文字コードの国際標準です。各文字に一意の番号(コードポイント)を割り当て、文字の表示方法やプロパティ(例:大文字・小文字、数字、記号、空白文字など)を定義しています。Unicodeはバージョンアップを重ねており、新しい文字や絵文字、スクリプトが追加されたり、既存の文字のプロパティが修正されたりします。

UTF-8

UTF-8は、Unicode文字をバイト列にエンコードするための可変長文字エンコーディング方式の一つです。ASCII互換性があり、英語圏のテキストでは1バイト、日本語や中国語などの文字では3バイト、絵文字などでは4バイトを使用します。Webや多くのシステムで広く採用されています。

lib9/utf

lib9/utfは、Go言語のランタイム内部で使用されるC言語で書かれたライブラリで、UTF-8エンコーディングされた文字列の処理やUnicode文字のプロパティに関する機能を提供します。Go言語の標準ライブラリ(例:unicodeパッケージ)の一部は、この低レベルなC言語ライブラリの機能を利用している可能性があります。

runetype.crunetypebody-X.Y.Z.h

runetype.cは、Unicode文字のプロパティを検索するためのC言語のソースファイルです。このファイルは、runetypebody-X.Y.Z.hというヘッダーファイルをインクルードしています。このヘッダーファイルは、mkrunetypeというツールによって、特定のバージョンのUnicodeData.txt(Unicodeの文字プロパティデータファイル)から自動生成されます。つまり、runetypebody-X.Y.Z.hには、そのバージョンに対応するUnicode文字のプロパティデータがC言語の配列や構造体として埋め込まれています。

Unicode 6.2.0 と 6.3.0

  • Unicode 6.2.0: 2012年9月にリリースされたバージョンです。
  • Unicode 6.3.0: 2013年9月にリリースされたバージョンです。このバージョンでは、主に新しい絵文字の追加や、既存の文字プロパティの微調整が行われました。特に、絵文字の多様性をサポートするための変更が含まれています。

技術的詳細

このコミットの技術的な核心は、Goランタイムが使用するUnicode文字プロパティデータのバージョンを更新することです。これは、以下のステップで実現されます。

  1. Makefileの更新: src/lib9/utf/Makefile内のUNICODE_VERSION変数を6.2.0から6.3.0に変更します。これにより、mkrunetypeツールがUnicode 6.3.0のデータに基づいてrunetypebodyヘッダーファイルを生成するようになります。
  2. runetype.cのインクルードパスの変更: src/lib9/utf/runetype.c内でインクルードされるヘッダーファイル名をrunetypebody-6.2.0.hからrunetypebody-6.3.0.hに変更します。これにより、コンパイル時に新しいバージョンのUnicodeデータが組み込まれるようになります。
  3. runetypebody-X.Y.Z.hのファイル名変更と内容更新: 既存のsrc/lib9/utf/runetypebody-6.2.0.hsrc/lib9/utf/runetypebody-6.3.0.hにリネームされ、その内容がUnicode 6.3.0のデータに基づいて更新されます。コミットの差分を見ると、__isspacer配列から0x180e(モンゴル語の母音分離記号 MONGOLIAN VOWEL SEPARATOR)が削除されていることがわかります。これは、Unicode 6.3.0でこの文字のプロパティが変更され、空白文字(Space_Separator)ではなくなったことを示唆しています。

この変更により、Go言語のunicodeパッケージや、内部で文字プロパティを参照する他の機能が、Unicode 6.3.0の定義に従って動作するようになります。例えば、unicode.IsSpace関数は、0x180eを空白文字として認識しなくなるでしょう。

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

このコミットで変更されたファイルは以下の3つです。

  1. src/lib9/utf/Makefile:

    --- a/src/lib9/utf/Makefile
    +++ b/src/lib9/utf/Makefile
    @@ -21,10 +21,10 @@ runetypebody-%.h: mkrunetype UnicodeData-%.txt
     
     CLEANFILES+=UnicodeData.txt
     
    -UNICODE_VERSION=6.2.0
    +UNICODE_VERSION=6.3.0
     
     test: mkrunetype UnicodeData-$(UNICODE_VERSION).txt
     	mkrunetype -c UnicodeData-$(UNICODE_VERSION).txt
     
     clean:
    -	rm -f UnicodeData.txt mkrunetype
    \ No newline at end of file
    +	rm -f UnicodeData.txt mkrunetype
    
  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)\n     return 0;\n }\n \n-#include "runetypebody-6.2.0.h"\n+#include "runetypebody-6.3.0.h"
    
  3. src/lib9/utf/{runetypebody-6.2.0.h => runetypebody-6.3.0.h} (ファイル名変更と内容変更):

    --- a/src/lib9/utf/runetypebody-6.2.0.h
    +++ b/src/lib9/utf/runetypebody-6.3.0.h
    @@ -1,4 +1,4 @@
    -/* generated automatically by mkrunetype.c from UnicodeData-6.2.0.txt */
    +/* generated automatically by mkrunetype.c from UnicodeData-6.3.0.txt */
     
     static Rune __isspacer[] = {
     	0x0009, 0x000d,
    @@ -6,7 +6,6 @@ static Rune __isspacer[] = {
     	0x0085, 0x0085,
     	0x00a0, 0x00a0,
     	0x1680, 0x1680,
    -	0x180e, 0x180e,
     	0x2000, 0x200a,
     	0x2028, 0x2029,
     	0x202f, 0x202f,
    

コアとなるコードの解説

  • Makefileの変更: UNICODE_VERSION=6.3.0への変更は、ビルドシステムに対して、Unicode 6.3.0のデータを使用するように指示します。これにより、mkrunetypeツールが実行される際に、最新のUnicodeデータファイル(UnicodeData-6.3.0.txt)が参照され、それに基づいてrunetypebody-6.3.0.hが生成されるようになります。
  • runetype.cの変更: #include "runetypebody-6.3.0.h"への変更は、runetype.cがコンパイルされる際に、新しいバージョンのUnicodeプロパティデータが組み込まれることを保証します。これにより、runetype.c内の文字分類関数などが、Unicode 6.3.0の定義に従って動作するようになります。
  • runetypebody-X.Y.Z.hの変更: このファイルはmkrunetypeツールによって自動生成されるため、手動で編集されることはありません。コミットの差分に表示されているのは、ファイル名が変更され、かつ内容がUnicode 6.3.0のデータに基づいて更新された結果です。特に注目すべきは、__isspacer配列から0x180e(MONGOLIAN VOWEL SEPARATOR)が削除されている点です。これは、Unicode 6.3.0において、この文字が空白文字のカテゴリから外れたことを意味します。これにより、Go言語のunicode.IsSpace関数などが、この文字を空白文字として扱わなくなるため、テキスト処理の挙動に影響を与える可能性があります。

これらの変更は、Go言語がUnicode文字を扱う際の正確性と最新性、そして国際化対応の品質を向上させるために不可欠です。

関連リンク

参考にした情報源リンク

  • Unicode 6.2.0: https://www.unicode.org/versions/Unicode6.2.0/
  • Unicode 6.3.0: https://www.unicode.org/versions/Unicode6.3.0/
  • Go言語のソースコード(GitHub): https://github.com/golang/go
  • Go言語のコードレビューシステム (Gerrit): https://go-review.googlesource.com/ (コミットメッセージに記載されているhttps://golang.org/cl/68820043は、Gerritの変更リストへのリンクです。)
  • MONGOLIAN VOWEL SEPARATORのUnicodeプロパティに関する情報 (Unicode 6.3.0以降の変更点): https://www.unicode.org/Public/6.3.0/ucd/PropList.txt (このファイルで180Eを検索すると、Mn (Mark, Nonspacing) に分類されていることが確認できます。以前のバージョンではZs (Space_Separator) に分類されていた可能性があります。)
  • mkrunetypeツールの役割に関する一般的な情報 (Goのソースコード内のコメントや関連ドキュメントから推測): Goのsrc/cmd/go/internal/runetypeディレクトリやsrc/unicodeパッケージの関連ファイルを参照。