Go语言 如何检查符文是否有效?[重复]

u1ehiz5o  于 2024-01-04  发布在  Go
关注(0)|答案(1)|浏览(108)

此问题在此处已有答案

How to get the last X Characters of a Golang String?(2个答案)
20天前关闭。
我正在尝试在Go语言中使用Reverse函数。但是通过反转字节,它可能是无效的符文。如何处理这种情况?

  1. func Reverse(input string) string {
  2. builder := strings.Builder{}
  3. builder.Grow(len(input))
  4. for i, w := len(input)-1, 0; i >= 0; i -= w {
  5. r, width := utf8.DecodeLastRuneInString(input[:i+1])
  6. w = width
  7. builder.WriteRune(r)
  8. }
  9. return builder.String()
  10. }

字符串
如果我试着按原样写符文,它会有意想不到的结果,但我想返回一个错误

atmip9wb

atmip9wb1#

utf8.DecodeLastRuneInString()说明了如果编码无效,则返回RuneError, 1。您可以检查并决定接下来要做什么:

  1. func Reverse(input string) string {
  2. builder := strings.Builder{}
  3. builder.Grow(len(input))
  4. for i, w := len(input)-1, 0; i >= 0; i -= w {
  5. r, width := utf8.DecodeLastRuneInString(input[:i+1])
  6. w = width
  7. if r == utf8.RuneError {
  8. fmt.Println("Invalid rune at", i)
  9. continue
  10. }
  11. builder.WriteRune(r)
  12. }
  13. return builder.String()
  14. }

字符串
测试它:

  1. fmt.Println(Reverse("Hello, 世界"))
  2. fmt.Println(Reverse("Hello,\xff 世界"))


输出(在Go Playground上尝试):

  1. 界世 ,olleH
  2. Invalid rune at 6
  3. 界世 ,olleH


还要注意的是,你可以编写没有变量的循环,只需要重新切片input变量:

  1. for len(input) > 0 {
  2. r, size := utf8.DecodeLastRuneInString(input)
  3. input = input[:len(input)-size]
  4. if r == utf8.RuneError {
  5. fmt.Println("Invalid rune at", len(input))
  6. continue
  7. }
  8. builder.WriteRune(r)
  9. }


这个输出是一样的,在Go Playground上试试。

展开查看全部

相关问题