2012-10-05 7 views
14

私は中国語で文字列を持っている:GoでUTF-8文字列をループする方法は?

x = "你好" 

私はそれをループしたいとし、その中に各文字で何かを、のようなものだろう:

for i, len := 0, len(x); i < len; i++ { 
    foo(x[i]) // do sth. 
} 

私はlen(x)6を返すことがわかりました2の代わりに、Googleの後に文字列の実際の長さを返すメソッドRuneCountInStringが見つかりましたが、私はまだどのようにループするのかわかりませんx[i]は、例えばx[0] == '你'のような正しい文字を得ます。

ありがとう

答えて

28

rangeを使用してください。

x = "你好" 
for _, c := range x { 
    // do something with c 
} 

ランダムアクセスが必要な場合は、文字インデックスではなくコードユニットインデックスを使用する必要があります。幸い、文字インデックスが必要な理由はないので、コードユニットのインデックスは問題ありません。

ほとんどの言語はまったく同じ問題を抱えています。たとえば、JavaやC#では可変長エンコーディングであるUTF-16を使用しています(しかし、一部の人はそうではないと思う人もいます)。

GoでUTF-8を使用する理由の詳細については、UTF-8 Manifestoを参照してください。

+0

マイナー修正: 'range s'はもちろん' range x'です – ANisus

関連する問題