变形金刚和切片

时间:2013-10-17 16:33:53

标签: go

我在阅读具有固定列长格式的文件时遇到了一些麻烦。有些列可能包含变音符号。

变音符号似乎使用2个字节而不是1个字节。这不是我期待的行为。是否有任何类型的函数返回子字符串?在这种情况下,切片似乎不起作用。

以下是一些示例代码:

http://play.golang.org/p/ZJ1axy7UXe

umlautsString := "Rhön"
fmt.Println(len(umlautsString))
fmt.Println(umlautsString[0:4])

打印:

5
Rhö

3 个答案:

答案 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 == "??")
}

https://pkg.go.dev/golang.org/x/exp/utf8string