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

< 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エンコードされていることが規定されています。したがって、それ以外の文字コードを使用することは仕様に反するものです。

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\user1> 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\user1>
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.