Goで文字列の先頭から特定の文字数だけを出力するのが、意外と悩んだのでちょっとメモします。
Goでは文字列はbyteのsliceのような扱いになります。なのでASCIIコードはいいのですが、UTF-8の文字列を適当に扱うと、UTF-8の文字列として不正なバイト列になることがあります(UTF-8は変なところで切ると必ず不正なバイト列になる)。
今回は『こんにちは』という文字列の先頭2文字だけを表示することを考えます。
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
str := "こんにちは"
fmt.Println(len(str))
fmt.Println(utf8.RuneCountInString(str))
fmt.Println(str[:3])
fmt.Println(string([]rune(str)[:2]))
}
出力:
15
5
こ
こん
文字列でlen
を使うとバイト列としての長さが出るので、ひらがなだと文字数の3倍になるはずです。UTF-8の文字列としての長さを知りたい場合はutf8.RuneCountInString
を使う必要があります。
そしてruneというのがUTF-8の1文字を表すので、文字列をruneのsliceにキャストします。そうすれば先頭2文字を切り出す事はできるので、それをstringにキャストすればいいです。
もっと簡単にできる方法があれば、教えてくれるとうれしいです。