Golang 从符文转换为字符串

新手上路,请多包涵

我有以下代码,它应该将 rune 转换为 string 并打印出来。但是,打印时出现未定义的字符。我无法弄清楚错误在哪里:

 package main

import (
    "fmt"
    "strconv"
    "strings"
    "text/scanner"
)

func main() {
    var b scanner.Scanner
    const a = `a`
    b.Init(strings.NewReader(a))
    c := b.Scan()
    fmt.Println(strconv.QuoteRune(c))
}

原文由 user3551708 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 984
2 个回答

那是因为您使用了 Scanner.Scan() 来读取 rune 但它做了其他事情。 Scanner.Scan() can be used to read tokens or rune s of special tokens controlled by the Scanner.Mode bitmask, and it returns special constants form the text/scanner 包,而不是读取的符文本身。

要读取单个 rune 使用 Scanner.Next() 代替:

 c := b.Next()
fmt.Println(c, string(c), strconv.QuoteRune(c))

输出:

 97 a 'a'

如果您只想将单个 rune 转换为 string ,请使用简单的类型 转换rune 是 --- 的别名,并将整数转换为 int32 string

将有符号或无符号整数值转换为字符串类型会生成一个包含整数的 UTF-8 表示形式的字符串。

所以:

 r := rune('a')
fmt.Println(r, string(r))

输出:

 97 a

同样要遍历 string 值的符文,您可以简单地使用 for ... range 构造:

 for i, r := range "abc" {
    fmt.Printf("%d - %c (%v)\n", i, r, r)
}

输出:

 0 - a (97)
1 - b (98)
2 - c (99)

或者您可以简单地将 string 值转换为 []rune

 fmt.Println([]rune("abc")) // Output: [97 98 99]

还有 utf8.DecodeRuneInString()

尝试 Go Playground 上的示例。

笔记:

您的原始代码(使用 Scanner.Scan() )是这样工作的:

  1. 您调用了 Scanner.Init() 将模式 ( b.Mode ) 设置为 scanner.GoTokens
  2. Calling Scanner.Scan() on the input (from "a" ) returns scanner.Ident because "a" is a valid Go identifier:
    c := b.Scan()
   if c == scanner.Ident {
       fmt.Println("Identifier:", b.TokenText())
   }

   // Output: "Identifier: a"

原文由 icza 发布,翻译遵循 CC BY-SA 3.0 许可协议

我知道我参加派对有点晚了,但这里有一个 []rune to string 函数:

 func runesToString(runes []rune) (outString string) {
    // don't need index so _
    for _, v := range runes {
        outString += string(v)
    }
    return
}

是的,有一个命名的 return 但我认为在这种情况下没关系,因为它减少了行数并且功能很短

原文由 MarkJL 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题