トラック
/
Go
Go
/
シラバス
/
ルーン文字
ルー

ルーン文字 の Go

3個の演習

ルーン文字について

Goのrune型は、int32のエイリアスです。 この基底となるint32型があるため、rune型は符号付き32ビットの整数値を保持します。 しかし、int32型とは異なり、rune型に格納される整数値は1つのUnicode文字を表します。

UnicodeとUnicodeコードポイント

UnicodeはASCIIの上位集合で、すべての文字に一意の番号を割り当てて文字を表現します。 この一意の番号は、Unicodeコードポイントと呼ばれます。 Unicodeは、世界中のあらゆる文字をUnicodeコードポイントとして表現することを目指しています。そこには、さまざまなアルファベット、数字、記号、さらには絵文字も含まれます。

Goでは、rune型は1つのUnicodeコードポイントを表します。

次の表は、Unicode文字の例と、それぞれのUnicodeコードポイントおよび10進数の値を示しています:

Unicode Character Unicode Code Point Decimal Value
0 U+0030 48
A U+0041 65
a U+0061 97
¿ U+00BF 191
π U+03C0 960
🧠 U+1F9E0 129504

UTF-8

UTF-8は可変幅の文字エンコーディングで、すべてのUnicodeコードポイントを1、2、3、または4バイトでエンコードするために使われます。 Unicodeコードポイントは最大4バイトでエンコードできるため、rune型は最大4バイトのデータを保持できる必要があります。 int32型が最大4バイトのデータを保持できるので、rune型がint32のエイリアスになっているのはそのためです。

GoのソースコードファイルはUTF-8でエンコードされています。

Runeを使う

rune型の変数は、文字をシングルクォートで囲んで宣言します:

myRune := '¿'

runeは単なるint32のエイリアスなので、runeの型を出力するとint32になります:

myRune := '¿'
fmt.Printf("myRune type: %T\n", myRune)
// Output: myRune type: int32

同様に、runeの値を出力すると、その整数(10進数)の値が表示されます:

myRune := '¿'
fmt.Printf("myRune value: %v\n", myRune)
// Output: myRune value: 191

runeが表すUnicode文字を出力するには、%cフォーマット動詞を使います:

myRune := '¿'
fmt.Printf("myRune Unicode character: %c\n", myRune)
// Output: myRune Unicode character: ¿

runeが表すUnicodeコードポイントを出力するには、%Uフォーマット動詞を使います:

myRune := '¿'
fmt.Printf("myRune Unicode code point: %U\n", myRune)
// Output: myRune Unicode code point: U+00BF

文字をシングルクォートで囲んでruneを定義する方法のほかに、16進数または10進数の数値を指定することもできます:

myRune := rune(0xbf)
myRune = 191
fmt.Printf("myRune Unicode character: %c\n", myRune)
// Output: myRune Unicode character: ¿

Runeと文字列

Goの文字列はUTF-8でエンコードされているため、Unicode文字を含んでいます。 文字列内の文字は、それが表すUnicode文字に応じて、1、2、3、または4バイトとして格納・エンコードされます。

Goでは、シーケンスを表すのにスライスが使われ、これらのスライスはrangeを使って繰り返し処理できます。 文字列を繰り返し処理するとき、Goはその文字列を一連のRuneに変換します。それぞれのRuneは4バイトです(rune型はint32のエイリアスであることを思い出してください!)。

文字列は単なるバイトのスライスですが、rangeキーワードは文字列のバイトではなく、そのruneを繰り返し処理します。

この例では、index変数は現在のruneのバイトシーケンスの開始インデックスを表し、char変数は現在のruneを表します:

myString := "❗hello"
for index, char := range myString {
  fmt.Printf("Index: %d\tCharacter: %c\t\tCode Point: %U\n", index, char, char)
}
// Output:
// Index: 0	Character: ❗		Code Point: U+2757
// Index: 3	Character: h		Code Point: U+0068
// Index: 4	Character: e		Code Point: U+0065
// Index: 5	Character: l		Code Point: U+006C
// Index: 6	Character: l		Code Point: U+006C
// Index: 7	Character: o		Code Point: U+006F

runeは1、2、3、または4バイトとして格納されるため、文字列の長さが常に文字列の文字数と等しいとは限りません。 文字列の長さをバイト単位で取得するには組み込みのlen関数を、文字列内のruneの数を取得するにはutf8.RuneCountInString関数を使います:

import "unicode/utf8"

myString := "❗hello"
stringLength := len(myString)
numberOfRunes := utf8.RuneCountInString(myString)

fmt.Printf("myString - Length: %d - Runes: %d\n", stringLength, numberOfRunes)
// Output: myString - Length: 8 - Runes: 6

Runeの型変換

runeのスライスは文字列に型変換できます:

myRuneSlice := []rune{'e', 'x', 'e', 'r', 'c', 'i', 's', 'm'}
myString := string(myRuneSlice)
fmt.Println(myString)
// Output: exercism

同様に、文字列はruneのスライスに型変換できます。 フォーマット動詞を使わない場合、runeを出力するとその整数(10進数)の値が表示されることを思い出してください:

myString := "exercism"
myRuneSlice := []rune(myString)
fmt.Println(myRuneSlice)
// Output: [101 120 101 114 99 105 115 109]
GitHubで編集 リンクは新しいウィンドウまたはタブで開きます

ルーン文字を学習する

練習はロックされています

ルーン文字を練習するには、あと2個の演習のロックを解除してください