Go/ソースコードの表現方法

出典: フリー教科書『ウィキブックス(Wikibooks)』
< Go
ナビゲーションに移動 検索に移動

ソースコードの表現方法[編集]

ソースコードは、UTF-8でエンコードされたUnicodeテキストです。テキストは正規化されていないので、1つのアクセント付きコードポイントは、アクセントと文字を組み合わせて作られた同じ文字とは区別され、それらは2つのコードポイントとして扱われます[1]。『The Go Programming Language Specification』では、簡単のために、原文中のUnicodeコードポイントを参照するために、修飾語ではないcharacterを使用します。

例えば、大文字と小文字は異なる文字です。

実装上の制限。他のツールとの互換性のために、コンパイラーはソース・テキスト中の NUL 文字(NUL character; U+0000)を許可しないことがあります。

実装上の制限。他のツールとの互換性のため、コンパイラーは UTF-8 でエンコードされたバイトオーダーマーク(BOM; U+FEFF)がソース・テキスト内で最初の Unicode コードポイントである場合、それを無視してもかまいません。バイトオーダーマークは、ソース内の他の場所では許可されません。


この様に、ソースコードの文字コードを言語仕様書で明確に規定しているので、それ以外の文字コードを使うことは仕様に反した使用方法です。

UTF-8エンコードに規定されているのはソースコードだけなので、他の文字コードでエンコーディングされたファイルの読み書きは専用のパッケージで定義された関数を使います。

日本語
"golang.org/x/text/encoding/japanese" -- EUCJP, ISO2022JP, ShiftJIS
中文繁體
"golang.org/x/text/encoding/traditionalchinese" -- Big5


パッケージ "golang.org/x/text/encoding/japanese" のインストール
PowerShell 7.1.4
Copyright (c) Microsoft Corporation.

https://aka.ms/powershell
Type 'help' to get help.

PS C:\Users\eguchi> go get -v golang.org/x/text/encoding/japanese
go: downloading golang.org/x/text v0.3.7
golang.org/x/text/encoding/internal/identifier
golang.org/x/text/transform
golang.org/x/text/encoding
golang.org/x/text/encoding/internal
golang.org/x/text/encoding/japanese
PS C:\Users\eguchi>
ShiftJISでエンコードされたファイルを(別の)ファイルにEUC-JPエンコーディングで書き出す関数
package conversion

import (
	"io"

	"golang.org/x/text/encoding/japanese"
	"golang.org/x/text/transform"
)

//Conversion
func Conversion(inStream io.Reader, outStream io.Writer) error {
	// ストリームからの読み込み(Shift-JIS → UTF-8)
	transform.NewReader(inStream, japanese.ShiftJIS.NewDecoder())

	// ストリームへの書き込み(UTF-8 → EUC-JP)
	transform.NewWriter(outStream, japanese.EUCJP.NewEncoder())

	// コピー
	if _, err := io.Copy(writer, reader); err != nil {
		return err
	}
	return nil
}

文字[編集]

以下の用語は、特定のUnicode文字クラスを示すために使用されます。

文字
newline = (* UnicodeコードポイントU+000A *) ;
unicode_char = (* newline を除く任意の Unicode コードポイント *) ;
unicode_letter = (* "Letter "に分類されるUnicodeコードポイント *) ;
unicode_digit = (* "Number, decimal digit" に分類される Unicode コードポイント *) ;

The Unicode Standard 8.0の4.5項「General Category」では、一連の文字カテゴリが定義されています。 Goでは、LetterカテゴリのLu、Ll、Lt、Lm、Loのいずれかに含まれるすべての文字をUnicodeの文字として扱い、NumberカテゴリのNdに含まれる文字をUnicodeの数字として扱います。

文字と数字[編集]

アンダースコア文字「_」(U+005F)は、文字とみなされます。

文字と数字
letter = unicode_letter | "_" ;
decimal_digit = "0" ... "9" ;
binary_digit = "0" | "1" ;
octal_digit   = "0"  "7" ;
hex_digit = "0" ... "9" | "A" ... "F" | "a" ... "f" ;


脚註[編集]

  1. ^ “Source code representation ¶”. The Go Programming Language Specification. The Go website. (Jul 26, 2021). https://golang.org/ref/spec#Source_code_representation.