[インデックス 14261] ファイルの概要
このコミットは、Go言語の仕様書(doc/go_spec.html
)を更新し、GoがサポートするUnicodeのバージョンをUnicode 6.0.0からUnicode 6.2.0に引き上げたことを反映しています。これは、Go言語が最新の文字セット標準に準拠し、より広範な国際文字を正確に処理できるようにするための重要な更新です。
コミット
commit 7ea65e5154deaed1ebe283a933f2a5a1a3b90625
Author: Rob Pike <r@golang.org>
Date: Wed Oct 31 10:32:15 2012 -0700
spec: we're now at Unicode 6.2.0
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/6812060
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/7ea65e5154deaed1ebe283a933f2a5a1a3b90625
元コミット内容
spec: we're now at Unicode 6.2.0
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/6812060
変更の背景
Go言語は、その設計当初からUnicodeを深くサポートしており、ソースコードはUTF-8でエンコードされたUnicodeテキストとして定義されています。これにより、Goは世界中の多様な言語や文字セットを扱うことができます。
このコミットが行われた2012年当時、Unicode Standardは継続的に更新されており、新しい文字の追加、既存の文字プロパティの変更、スクリプトの追加などが行われていました。Go言語の仕様書は、GoがどのUnicodeバージョンに準拠しているかを明記しており、言語の動作、特に識別子や文字列の処理において、そのバージョンに依存します。
Unicode 6.0.0から6.2.0への更新は、トルコリラ記号の追加や、文字プロパティの更新、テキスト分割・改行の改善など、いくつかの重要な変更を含んでいました。Go言語がこれらの最新の変更を反映し、国際化対応を強化するためには、仕様書を更新して準拠するUnicodeバージョンを明示的に引き上げる必要がありました。これにより、GoコンパイラやツールがUnicodeの最新の定義に基づいて文字を正しく解釈し、処理することが保証されます。
前提知識の解説
Unicodeとは
Unicode(ユニコード)は、世界中のあらゆる文字をコンピュータで扱うために開発された文字コードの国際標準です。従来の文字コードが特定の言語や地域に特化していたのに対し、Unicodeは単一の文字セットで地球上のほとんどの文字を表現することを目指しています。各文字には一意の「コードポイント」が割り当てられ、例えば「A」はU+0041、「あ」はU+3042といった形式で表現されます。
Unicodeのバージョン管理
Unicode Standardは、新しい文字の追加や既存の文字のプロパティ変更、スクリプトの追加など、定期的に更新されます。これらの更新はバージョン番号(例: Unicode 6.0.0, 6.1.0, 6.2.0)で管理され、各バージョンには特定の文字セットとそれらの文字に関する情報(カテゴリ、スクリプト、プロパティなど)が含まれます。ソフトウェアが特定のUnicodeバージョンに準拠するということは、そのバージョンで定義された文字の挙動やプロパティに従って処理を行うことを意味します。
Go言語とUnicode
Go言語は、Unicodeを非常に重視して設計されています。
- ソースコードのエンコーディング: GoのソースコードはUTF-8でエンコードされたUnicodeテキストとして扱われます。
rune
型: Goにはrune
という組み込み型があり、これはUnicodeのコードポイント(int32
のエイリアス)を表します。これにより、Goはバイト列ではなく、意味のある文字単位でテキストを処理できます。- 識別子: Goの識別子(変数名、関数名など)には、Unicodeの「文字(Letter)」カテゴリに属する文字や「数字(Digit)」カテゴリに属する文字を使用できます。これにより、非ASCII文字を含む識別子を記述することが可能です。
unicode
パッケージ: Goの標準ライブラリにはunicode
パッケージが含まれており、Unicode文字のプロパティ(文字種、大文字/小文字、数字かどうかなど)を判定したり、文字の変換を行ったりするための豊富な機能を提供します。
Go言語の仕様書では、unicode_letter
やunicode_digit
といった概念が定義されており、これらは特定のUnicodeバージョンの文字カテゴリに基づいて解釈されます。したがって、Go言語の仕様書が参照するUnicodeバージョンを更新することは、Go言語の文字処理の挙動に直接影響を与える可能性があります。
技術的詳細
このコミットは、Go言語の仕様書(doc/go_spec.html
)内の2箇所を修正しています。
-
仕様書の日付の更新:
<!-- "Subtitle": "Version of October 19, 2012", -->
が<!-- "Subtitle": "Version of October 31, 2012", -->
に変更されています。これは、仕様書自体が更新された日付を反映するもので、直接的な技術的変更ではありませんが、ドキュメントの正確性を保つためのものです。 -
参照するUnicodeバージョンの更新:
<a href="http://www.unicode.org/versions/Unicode6.0.0/">The Unicode Standard 6.0</a>
が<a href="http://www.unicode.org/versions/Unicode6.2.0/">The Unicode Standard 6.2</a>
に変更されています。これがこのコミットの核心的な変更点です。
Unicode 6.0.0から6.2.0への主な変更点
Unicode 6.2.0は、Unicode 6.0.0と比較していくつかの重要な変更と追加を含んでいます。特に注目すべきは以下の点です。
- トルコリラ記号の追加: Unicode 6.2.0の最も主要な追加は、U+20BA TURKISH LIRA SIGNの導入でした。これは、トルコリラを表す新しい通貨記号であり、緊急の需要に応えるために迅速にエンコードされました。
- 文字プロパティの更新: 標準には、文字プロパティに対する様々な変更が含まれており、これは文字の分類や処理に影響を与える可能性があります。
- データファイルのエンコーディング変更:
NamesList.txt
データファイルのエンコーディングがLatin-1からUTF-8に更新され、Unicode Character Database内の他のデータファイルとの一貫性が確保されました。 - テキスト分割と改行の改善: 特定の絵文字やその他の文字の改行挙動に関する変更が提案され、
Line_Break
プロパティや関連するUnicode Standard Annexes (UAX #14およびUAX #29) に影響を与えました。 - 一般カテゴリの調整: いくつかの一般的な句読点文字の
General_Category
プロパティが変更され、記号として分類されるようになりました。 - マイナーな文字固有の更新:
- U+0709 SYRIAC SUBLINEAR COLON SKEWED RIGHTに新しい正式なエイリアス(SYRIAC SUBLINEAR COLON SKEWED LEFT)が追加されました。
- 楔形文字の数字記号U+1240FからU+12414の数値が「4」-「9」から「40」-「90」に更新されました。
- U+065F ARABIC WAVY HAMZA BELOWが継承スクリプトからアラビア語スクリプトに再分類されました。
- Unicode 6.2.0は、コードチャートがバリエーションシーケンスを表示した最初のバージョンでもありました。
Go言語の仕様書がUnicode 6.2.0を参照するようになったことで、Goコンパイラやランタイムは、これらの新しい文字や変更されたプロパティを考慮して、文字の分類(例: 識別子に使用できる文字かどうか)、文字列の処理、正規表現のマッチングなどを行うことになります。これにより、Goプログラムがより広範なUnicodeテキストを正確かつ期待通りに処理できるようになります。
コアとなるコードの変更箇所
--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -1,6 +1,6 @@
<!--{
"Title": "The Go Programming Language Specification",
- "Subtitle": "Version of October 19, 2012",
+ "Subtitle": "Version of October 31, 2012",
"Path": "/ref/spec"
}-->
@@ -118,7 +118,7 @@ unicode_digit = /* a Unicode code point classified as "Decimal Digit" */ .
</pre>
<p>
-In <a href="http://www.unicode.org/versions/Unicode6.0.0/">The Unicode Standard 6.0</a>,
+In <a href="http://www.unicode.org/versions/Unicode6.2.0/">The Unicode Standard 6.2</a>,
Section 4.5 "General Category"
defines a set of character categories. Go treats
those characters in category Lu, Ll, Lt, Lm, or Lo as Unicode letters,
コアとなるコードの解説
このコミットにおけるコアとなるコードの変更は、doc/go_spec.html
ファイル内の2つの行の修正です。
-
Subtitle
の更新:- "Subtitle": "Version of October 19, 2012",
+ "Subtitle": "Version of October 31, 2012",
この変更は、Go言語の仕様書自体のバージョン日付を更新するものです。これは、ドキュメントが最後に改訂された日付を示しており、このコミットによって内容が更新されたことを示唆しています。直接的な言語の挙動には影響しませんが、ドキュメントのメタデータとして重要です。 -
Unicodeバージョンの参照更新:
- In <a href="http://www.unicode.org/versions/Unicode6.0.0/">The Unicode Standard 6.0</a>,
+ In <a href="http://www.unicode.org/versions/Unicode6.2.0/">The Unicode Standard 6.2</a>,
この変更がこのコミットの最も重要な部分です。Go言語の仕様書は、Goが文字をどのように扱うかを定義する際に、Unicode Standardの特定のバージョンを参照しています。以前はUnicode 6.0.0を参照していましたが、この変更によりUnicode 6.2.0を参照するようになりました。この変更が意味することは、Go言語のコンパイラやランタイムが、識別子、文字列、文字クラスの定義など、Unicodeに関連するすべての処理において、Unicode 6.2.0で定義された文字プロパティとカテゴリを使用するようになるということです。例えば、Goの識別子に使える文字の範囲や、
unicode
パッケージの関数が返す結果などが、Unicode 6.2.0の定義に基づいて決定されるようになります。これにより、Go言語は最新のUnicode標準に準拠し、トルコリラ記号のような新しい文字や、既存の文字のプロパティ変更に適切に対応できるようになります。これは、Go言語の国際化対応能力を向上させ、より多様な言語環境での利用をサポートするために不可欠な更新です。
関連リンク
- Go言語仕様: https://go.dev/ref/spec
- Unicode Standard: https://www.unicode.org/versions/
- Unicode 6.0.0: http://www.unicode.org/versions/Unicode6.0.0/
- Unicode 6.2.0: http://www.unicode.org/versions/Unicode6.2.0/
参考にした情報源リンク
- Unicode 6.2.0 vs 6.0.0 changes - babelstone.co.uk
- Unicode 6.2.0 - codepoints.net
- Unicode 6.2.0 - openjdk.org
- Unicode 6.2.0 - unicode.org
- Go language specification Unicode - go.dev
- Go language specification Unicode - marcusnoble.co.uk
- Go language specification Unicode - stackoverflow.com
- Go language specification Unicode - reintech.io
- Go language specification Unicode - ubc.ca