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

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

このコミットで変更されたファイルは src/pkg/compress/testdata/Mark.Twain-Tom.Sawyer.txt です。このファイルは、Go言語の標準ライブラリである compress パッケージのテストデータとして使用されているテキストファイルです。具体的には、マーク・トウェインの有名な小説「トム・ソーヤーの冒険」のテキストデータを含んでいます。テストデータとして利用されるため、圧縮・解凍処理の正確性やパフォーマンスを検証する際に用いられます。

コミット

compress/testdata: remove Byte Order Mark from the Tom Sawyer data.

I'm not sure where the BOM came from, originally.
http://www.gutenberg.org/files/74/74.txt doesn't have it, although
a fresh download of that URL gives me "\r\n"s instead of plain "\n"s,
and the extra line "Character set encoding: ASCII". Maybe Project
Gutenberg has changed their server configuration since we added that
file to the Go repo.

Anyway, this change is just manually excising the BOM from the start
of the file, leaving pure ASCII.

R=r, bradfitz
CC=golang-dev, krasin, rsc
https://golang.org/cl/6197061

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

https://github.com/golang/go/commit/32b85baae34ccf6908a981e48220d82119406e41

元コミット内容

このコミットは、compress/testdata/Mark.Twain-Tom.Sawyer.txt ファイルの先頭からバイトオーダーマーク (BOM) を削除するものです。コミットメッセージによると、BOMが元々どこから来たのかは不明ですが、参照元のProject GutenbergのURL (http://www.gutenberg.org/files/74/74.txt) にはBOMが含まれていないことが確認されています。また、現在のProject Gutenbergからのダウンロードでは、改行コードが \r\n になっており、さらに「Character set encoding: ASCII」という余分な行が追加されていることにも言及されています。この変更は、ファイルからBOMを手動で削除し、純粋なASCIIテキストとして残すことを目的としています。

変更の背景

この変更の背景には、主に以下の点が挙げられます。

  1. テストデータの整合性: compress パッケージのテストデータとして使用されるファイルに、意図しないBOMが含まれていることは、テストの信頼性や一貫性に影響を与える可能性があります。特に、テキスト処理や圧縮・解凍のテストにおいて、BOMの有無が結果に影響を及ぼすことを避けるため、純粋なテキストデータであることが望ましいです。
  2. BOMの取り扱い: BOMはUTF-8エンコーディングのファイルでよく見られますが、UTF-8ではBOMは必須ではなく、むしろ一部のシステムやアプリケーションでは問題を引き起こすことがあります。Go言語の標準ライブラリのテストデータとして、BOMがない純粋なASCII(またはUTF-8)テキストを使用することで、より広範な環境での互換性を確保し、予期せぬ挙動を防ぐことができます。
  3. Project Gutenbergのデータ変化: コミットメッセージに記載されているように、Project Gutenbergのサーバー設定やファイルの提供方法が時間とともに変化した可能性があります。過去に取得したデータにBOMが含まれていたとしても、現在の公式ソースには含まれていないため、テストデータを最新かつクリーンな状態に保つための調整が必要でした。

前提知識の解説

バイトオーダーマーク (Byte Order Mark, BOM)

バイトオーダーマーク (BOM) は、Unicodeテキストファイルの先頭に挿入される特殊なバイト列です。主にUTF-16やUTF-32のようなマルチバイト文字エンコーディングにおいて、バイトオーダー(エンディアンネス、すなわちバイトの並び順)を示すために使用されます。例えば、UTF-16ではビッグエンディアン (BE) とリトルエンディアン (LE) のどちらでバイトが並んでいるかを示すためにBOMが使われます。

UTF-8エンコーディングの場合、BOMはバイトオーダーを示す必要がないため、技術的には不要です。しかし、一部のWindowsアプリケーションなどでは、UTF-8ファイルであることを示すためにBOM (EF BB BF の3バイト列) をファイルの先頭に付加することがあります。このBOM付きUTF-8ファイルは、BOMを正しく処理できないシステムやプログラムにとっては、ファイルの先頭に予期せぬ文字(例えば、 のような表示)として現れたり、パースエラーの原因となったりすることがあります。

Project Gutenberg

Project Gutenberg(プロジェクト・グーテンベルク)は、著作権の切れた書籍を電子化し、無料で公開しているデジタルライブラリプロジェクトです。世界で最も古いデジタルライブラリの一つであり、多くの古典文学作品がテキスト形式で提供されています。これらのテキストファイルは、研究、教育、ソフトウェア開発など、様々な目的で利用されています。Go言語のテストデータとして「トム・ソーヤーの冒険」が使用されているのは、このような公開されたクリーンなテキストデータがテストに適しているためと考えられます。

技術的詳細

このコミットの技術的詳細は、BOMがテキスト処理に与える影響と、Go言語におけるその取り扱いに関連しています。

BOMとテキスト処理

BOMは、特にUTF-8ファイルにおいて、テキスト処理の際に問題を引き起こすことがあります。

  • パースエラー: BOMを予期しないパーサーやライブラリは、BOMを通常のデータの一部として解釈しようとし、結果としてパースエラーや不正な文字の表示を引き起こす可能性があります。例えば、JSONやXMLのパーサーがファイルの先頭にBOMを見つけると、それが有効なJSON/XMLではないと判断し、エラーを発生させることがあります。
  • 文字列比較: BOMが含まれる文字列と含まれない文字列を比較すると、BOMの有無によって異なる文字列と判断されるため、予期せぬ不一致が生じることがあります。
  • スクリプトの実行: シェルスクリプトやプログラミング言語のソースファイルにBOMが含まれていると、インタープリタがBOMを不正な文字として扱い、スクリプトの実行に失敗することがあります。
  • Go言語のcompressパッケージ: compressパッケージは、データの圧縮・解凍を行うためのものです。テストデータとして使用されるテキストファイルにBOMが含まれていると、圧縮前のデータと解凍後のデータの比較において、BOMの有無が影響を及ぼす可能性があります。また、BOMが原因で圧縮アルゴリズムが予期せぬ挙動を示す可能性もゼロではありません。このコミットは、そのような潜在的な問題を排除し、テストの堅牢性を高めることを目的としています。

ASCIIとUTF-8

  • ASCII: 7ビットで表現される文字コードで、英数字、記号、制御文字など、基本的なラテン文字セットを含みます。BOMはASCIIには存在しません。
  • UTF-8: Unicodeの可変長文字エンコーディングです。ASCII互換性があり、ASCII文字は1バイトで表現されます。UTF-8ではBOMは不要であり、推奨されません。BOMはUTF-8のファイルであることを示すための「署名」として一部のシステムで使われることがありますが、これは標準的な慣習ではありません。

このコミットは、Mark.Twain-Tom.Sawyer.txt ファイルを「純粋なASCII」にすることを目的としています。これは、ファイルがBOMを含まず、かつASCII文字セットの範囲内の文字のみで構成されることを意味します。これにより、ファイルが様々なシステムやツールで問題なく扱えるようになります。

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

--- a/src/pkg/compress/testdata/Mark.Twain-Tom.Sawyer.txt
+++ b/src/pkg/compress/testdata/Mark.Twain-Tom.Sawyer.txt
@@ -1,4 +1,4 @@
-The Project Gutenberg EBook of The Adventures of Tom Sawyer, Complete
+The Project Gutenberg EBook of The Adventures of Tom Sawyer, Complete
 by Mark Twain (Samuel Clemens)
 
 This eBook is for the use of anyone anywhere at no cost and with

このdiffは、src/pkg/compress/testdata/Mark.Twain-Tom.Sawyer.txt ファイルの最初の行が変更されたことを示しています。具体的には、-The Project Gutenberg EBook... から +The Project Gutenberg EBook... へと変更されています。

コアとなるコードの解説

この変更は非常にシンプルですが、重要な意味を持っています。

  • -The Project Gutenberg EBook...: この行の先頭にある  は、目に見えないバイトオーダーマーク (BOM) を表しています。UTF-8のBOMは EF BB BF の3バイトですが、テキストエディタによってはこれを特殊な文字として表示したり、全く表示しなかったりします。このコミット前のファイルには、このBOMがファイルの先頭に存在していました。
  • +The Project Gutenberg EBook...: 変更後の行では、このBOMが削除されています。これにより、ファイルの先頭は純粋なテキストデータから始まることになります。

この変更により、Mark.Twain-Tom.Sawyer.txt ファイルはBOMを含まない、より標準的なテキストファイルとなりました。これは、Go言語のcompressパッケージがこのファイルをテストデータとして読み込む際に、BOMによる予期せぬ挙動やパースの問題を回避するために重要です。特に、Goのテキスト処理ライブラリやファイルI/Oは、BOMを自動的にスキップしない場合があるため、テストデータからBOMを明示的に削除することは、テストの信頼性と移植性を高める上で有効な手段です。

関連リンク

参考にした情報源リンク