Go言語 の rune について

Go言語の rune 型について、string 型を扱う上で理解をしておく必要があるためまとめる。

まずは Go 言語の文字列型と Unicode と UTF-8 について。

文字列を表す string 型、中身はバイト配列となっている。そのため以下のように string 型の s に対してインデックス演算で s[i] でアクセスすると

	s := "あ"
	for i := 0; i < len(s); i++ {
		fmt.Printf("%02x ", s[i])
	}

出力は以下のように文字ではなく、バイトが出力される。

e3 81 82

Unicode では世界の各文字に対してコードポイントという値を割り当てている。例えば 「あ」という文字には 「3042」というコードポイントが対応する。UTF-8 では「3042」というコードポイントを表現するために「E3」、「81」、「82」という 3 つのバイトを対応させている。
Go 言語の string 型にはこの UTF-8 で Unicode のコードポイントを表現するためのバイトが保持されているということになる。
なぜ UTF-8 のバイト列が保持されているかというと Go 言語のファイルが標準で UTF-8 でコンパイルされるため。

Go 言語の rune 型は上記で説明したコードポイントと同義となっている。
rune 型は int32 のエイリアスとして定義されており、rune 型には整数値が入っている。Unicode のコードポイント、 1,114,112文字分を表現するための int32 となっている。
以下のようにすると rune 型が取り出せる。

s := "あ"
for _, runeValue := range s {
	fmt.Printf("%v", runeValue)
}

出力は以下のようになる。

12354

これで Unicode 、UTF-8、rune 型についてまとめると。

文字列「あ」に対しては以下のようになっていることがわかる。
Unicode:「3042」
UTF-8:「E3」、「81」、「82」
rune 型:「12354」

Unicode は世界中の文字(記号なども含む)を扱うための規格でそれぞれの文字にコードポイントを定義している。UTF-8 はバイトを用いてコードポイントを表現している。rune 型は int32 型の整数値を用いてコードポイントを表現している。そして、Go 言語の string 型に保持されているのは rune ではなく UTF-8 のバイトとなっている。

この記事が気に入ったらサポートをしてみませんか?