Language
string: len は文字数ではなくUTF-8のバイト数を返す
GoのstringはUTF-8バイト列であり、絵文字を含むとlenとrune数は一致しません。
Sourceutf8.go
Go 1.22
package stringexample
import "unicode/utf8"
func ByteLen(value string) int {
return len(value)
}
func RuneLen(value string) int {
return utf8.RuneCountInString(value)
}Testutf8_test.go
Go 1.22
package stringexample
import "testing"
func Test絵文字を含む文字列ではバイト数とrune数が異なる(t *testing.T) {
value := "Go🐹"
if got := ByteLen(value); got != 6 {
t.Fatalf("ByteLen() = %d, want 6", got)
}
if got := RuneLen(value); got != 3 {
t.Fatalf("RuneLen() = %d, want 3", got)
}
}01Assertion
このテストで確認できること
- Go🐹のlenは6バイトになる
- utf8.RuneCountInStringでは3文字として数える
画面上の文字数制限や切り詰めにlenを使うと、非ASCII文字で想定より早く上限へ達します。人が読む単位が必要ならrune数を明示します。
OBSERVED RESULT
input: "Go🐹"
len: 6
rune count: 3