我在阅读具有固定列长格式的文件时遇到了一些麻烦。有些列可能包含变音符号。
变音符号似乎使用2个字节而不是1个字节。这不是我期待的行为。是否有任何类型的函数返回子字符串?在这种情况下,切片似乎不起作用。
以下是一些示例代码:
http://play.golang.org/p/ZJ1axy7UXe
umlautsString := "Rhön"
fmt.Println(len(umlautsString))
fmt.Println(umlautsString[0:4])
打印:
5
Rhö
答案 0 :(得分:12)
在go中,一个字符串片会计算字节数,而不是runes。这就是"Rhön"[0:3]
为您提供Rh
和ö
的第一个字节的原因。
以UTF-8编码的字符表示为符文,因为UTF-8对多个字符进行编码 字节(最多四个字节),以提供更大范围的字符。
如果要使用[]
语法对字符串进行切片,请先将字符串转换为[]rune
。
示例(on play):
umlautsString := "Rhön"
runes = []rune(umlautsString)
fmt.Println(string(runes[0:3])) // Rhö
值得注意的是:This golang blog post about string representation in go。
答案 1 :(得分:3)
您可以将string
转换为[]rune
并使用它:
package main
import "fmt"
func main() {
umlautsString := "Rhön"
fmt.Println(len(umlautsString))
subStrRunes:= []rune(umlautsString)
fmt.Println(len(subStrRunes))
fmt.Println(string(subStrRunes[0:4]))
}
http://play.golang.org/p/__WfitzMOJ
希望有所帮助!
答案 2 :(得分:0)
另一个选项是 utf8string
包:
package main
import "golang.org/x/exp/utf8string"
func main() {
s := utf8string.NewString("?????")
// example 1
n := s.RuneCount()
println(n == 5)
// example 2
t := s.Slice(0, 2)
println(t == "??")
}