10

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

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

这是一些示例代码:

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

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

印刷:

5
Rhö
4

3 回答 3

12

在 go 中,字符串的一部分计算字节数,而不是runes。这就是为什么"Rhön"[0:3]给你Rhö.

以 UTF-8 编码的字符表示为符文,因为 UTF-8 将字符编码为超过一个字节(最多四个字节)以提供更大范围的字符。

如果要使用[]语法对字符串进行切片,请将字符串转换为[]rune之前的字符串。示例(播放中):

umlautsString := "Rhön"
runes = []rune(umlautsString)
fmt.Println(string(runes[0:3])) // Rhö

值得注意:这篇关于 go 中字符串表示的 golang 博客文章

于 2013-10-17T16:40:58.347 回答
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

希望有帮助!

于 2013-10-17T16:42:10.217 回答
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

于 2021-04-19T02:44:43.580 回答