golang : 日本語(マルチバイト)文字を含む string の substring
go では string のスライスは byte として扱われるので、日本語のようにマルチバイト文字を含んだ文字列 str に対して str[start:start+length]
のようなことをすると、思わぬ場所が切り取られてしまいます。
この問題を回避するために、一旦 rune にキャストしてから string に戻します。
func substring(str string, start, length int) string { if start < 0 || length <= 0 { // 明らかに不正な値なので、チェックせずに進んで panic を起こしても良さそうです。 return str } r := []rune(str) if start + length > len(r) { return string(r[start:]) } else { return string(r[start:start + length]) } }