【问题标题】:Umlauts and slices元音变音和切片
【发布时间】:2013-10-17 16:33:52
【问题描述】:

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

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

这里有一些示例代码:

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

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

打印:

5
Rhö

【问题讨论】:

    标签: go


    【解决方案1】:

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

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

    如果要使用[] 语法对字符串进行切片,请先将字符串转换为[]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

    【讨论】:

    • 感谢您的回答。我没有意识到可以转换为[]rune - 这将允许我清理我最近的一些代码。
    • “UTF-8 字符被编码为符文”完全没有意义。您能否澄清、重写或删除它?
    • @rightfold 你太粗鲁了。这对至少 9 个人来说是有意义的,因此删除答案是毫无疑问的。您本可以很好地要求澄清,但在这种情况下,您似乎懒得关注 nemo 发布的任何一个链接,这两个链接都详细解释了符文是什么。
    • @x3ro 我知道符文是什么,我知道什么是编码,我引用的部分没有意义(不仅对我来说,而且总的来说)。没有“UTF-8 字符”之类的东西。此外,我从来没有说过 nemo 应该澄清、重写或删除整个答案,只有我引用的部分
    • @rightfold:请您查看RFC 3629 以重新评估“UTF-8 字符”是否存在。你怎么能假设被接受了 10 次的答案有一些没有意义的部分一般来说?这似乎有点牵强。
    【解决方案2】:

    您可以将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

    希望有帮助!

    【讨论】:

      【解决方案3】:

      另一个选项是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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-31
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多