web-dev-qa-db-ja.com

文字列から単一のUnicode文字を取得する方法

文字列からUnicode文字を取得するにはどうすればよいですか。たとえば、文字列が「你好」の場合、最初の文字「你」を取得するにはどうすればよいですか?

別の場所から私は1つの方法を取得します。

var str = "你好"
runes := []rune(str)
fmt.Println(string(runes[0]))

それは動作します。しかし、私はまだいくつかの質問があります:

  1. それを行う別の方法はありますか?

  2. なぜGoではstr[0]文字列からUnicode文字を取得しませんが、バイトデータを取得しますか?

20
赵浩翔

まず、あなたは読みたいかもしれません https://blog.golang.org/strings それはあなたの質問の一部に答えます。

Goの文字列には、任意のバイトを含めることができます。 str [i]を書き込むと、結果はバイトになり、インデックスは常にバイト数になります。

ほとんどの場合、文字列はUTF-8でエンコードされます。文字列のUTF-8エンコーディングを処理する方法は複数あります。

たとえば、for ... rangeステートメントを使用して、ルーンごとに文字列ルーンを反復できます。

var first rune
for _,c := range str {
    first = c
    break
}
// first now contains the first rune of the string

Unicode/utf8パッケージを活用することもできます。例えば:

r, size := utf8.DecodeRuneInString(str)
// r contains the first rune of the string
// size is the size of the rune in bytes

文字列がUTF-8でエンコードされている場合、ルーン文字のサイズ(バイト単位)は一定ではないため、文字列のn番目のルーンに直接アクセスする方法はありません。この機能が必要な場合は、独自のヘルパー関数を簡単に記述して(for ... rangeを使用して、またはunicode/utf8パッケージを使用して)できます。

18
Didier Spezia