Go 言語には 2 種類の文字があります。
- 1つは、ASCIIコードの文字を表すuint8型、つまりbyte型です。
- もう 1 つは UTF-8 文字を表すルーン タイプで、日本語、日本語、その他の複合文字を処理する必要がある場合に必要です。ルーン型は int32 型と同等です。
バイト型は uint8 のエイリアスであり、var ch byte = ‘A’ などの 1 バイトのみを占有する従来の ASCII エンコード文字についてはまったく問題なく、文字は一重引用符で囲まれます。
ASCIIコード表ではAの値は65、16進数表記では41となるため、以下の記述方法は等価です。
var ch byte = 65 或 var ch byte = ‘\x41’ //(\x 总是紧跟着长度为 2 的 16 进制数)
もう 1 つの可能性は、 \
の後に長さ 3 の 8 進数が続くことです (例: \377)。
Go 言語は Unicode (UTF-8) もサポートしているため、文字は Unicode コード ポイントまたはルーンとも呼ばれ、メモリ内では int で表されます。文書内では一般に U+hhhh の形式で表現します。h は 16 進数を表します。
Unicode 文字を記述する場合は、16 進数の前に接頭辞\u
または\U
を追加する必要があります。 Unicode は少なくとも 2 バイトを占めるため、int16 または int 型を使用して表現します。最大 4 バイトを使用する必要がある場合は\u
接頭辞を使用し、最大 8 バイトを使用する必要がある場合は\U
接頭辞を使用します。
var ch int = '\u0041'
var ch2 int = '\u03B2'
var ch3 int = '\U00101234'
fmt.Printf("%d - %d - %d\n", ch, ch2, ch3) // 整数
fmt.Printf("%c - %c - %c\n", ch, ch2, ch3) // 文字
fmt.Printf("%X - %X - %X\n", ch, ch2, ch3) // UTF-8バイト
fmt.Printf("%U - %U - %U", ch, ch2, ch3) // UTF-8コードポイント
出力:
65 – 946 – 1053236
A – β – r
41 – 3B2 – 101234
U+0041 – U+03B2 – U+101234
書式指定子%c
文字を表すために使用されます。文字と一緒に使用すると、 %v
または%d
文字を表す整数を出力し、 %U
U+hohh の形式で文字列を出力します。
Unicode パッケージには文字をテストするための組み込み関数がいくつかあり、これらの関数の戻り値は次のようなブール値です (ch は文字を表します)。
- それが文字であるかどうかを判断します: unicode.IsLetter(ch)
- 数値かどうかを判断します: unicode.IsDigit(ch)
- 空白シンボルかどうかを判断します: unicode.IsSpace(ch)
UTF-8 と Unicode の違いは何ですか?
Unicode は、ASCII と同様に文字セットです。
文字セットは、各文字に一意の ID を割り当てます。使用するすべての文字は、Unicode 文字セット内で一意の ID を持ちます。たとえば、上の例の a のエンコードは、Unicode と ASCII の両方で 97 です。 Unicode における漢字「you」のエンコードは 20320 です。各国の文字セットでは、文字に対応する ID が異なります。いずれの場合も、Unicode での文字の ID は変わりません。
UTF-8 は、Unicode の文字 ID を特定の方法でエンコードするエンコード ルールであり、1 バイトから 4 バイトまでの可変長のエンコード ルールです。エンコード規則は次のとおりです。
- 0xxxxxx は、ASCII 文字セットと互換性のある文字記号 0 ~ 127 を示します。
- 128 から 0x10ffff は他の文字を表します。
この規則によれば、ラテン語族の文字エンコーディングは一般に 1 文字あたり 1 バイトを占有しますが、日本語の 1 文字は 3 バイトを占有します。
広い意味での Unicode は、文字セットとエンコード規則、つまり Unicode 文字セットと UTF-8、UTF-16 エンコードなどを定義する標準を指します。