【问题标题】:How to convert a string to rune?如何将字符串转换为符文?
【发布时间】:2021-03-19 14:21:32
【问题描述】:

这是我的代码 sn-p:

var converter = map[rune]rune {//some data}

sample := "⌘こんにちは"

var tmp string

for _, runeValue := range sample {
        fmt.Printf("%+q", runeValue)
        tmp = fmt.Sprintf("%+q", runeValue)
    }

fmt.Printf("%+q", runeValue) 的输出是:

'\u2318'
'\u3053'
'\u3093'
'\u306b'
'\u3061'
'\u306f'

这些值实际上是符文,但由于Sprintf 的返回类型是字符串,我不能在我的地图[rune]rune 中使用它。 我想知道如何将字符串转换为符文,或者换句话说,我该如何处理这个问题?

【问题讨论】:

  • []rune(sample) ?比如play.golang.org/p/ISPOEvSzFQW
  • 一个string不是一个rune,它可能包含多个runes。 for range 迭代其符文,或者您可以使用类似[]rune(sample) 的转换来获取string 的所有符文作为切片。你的问题到底是什么?
  • 感谢@mh-cbon。我不想只在控制台上打印它们,但我想在我的地图中使用这些值。
  • 谢谢@icza,你知道我想将一些符文值映射到另一个符文值。因此,通过在字符串上使用range,我想获取每个rune 并在我的地图中使用它来找到相应的rune。顺便说一句,我正在尝试实现字符编码
  • @icze,但我的问题是如何获得那个符文。通过在 here 中使用 Rob pike 的建议,我使用 "%+q" 获取每个符文,但 Sprintf 以字符串形式返回。我想知道是否有另一种方法可以使用"%+q" 并作为符文返回

标签: string go character-encoding rune


【解决方案1】:

string 不是单个rune,它可能包含多个runes。您可以使用简单类型conversionstring 转换为包含所有符文的[]runes,例如[]rune(sample)

for range 遍历 string 的符文,因此在您的示例中,runeValue 的类型为 rune,您可以在您的 converter 映射中使用它,例如:

var converter = map[rune]rune{}
sample := "⌘こんにちは"
for _, runeValue := range sample {
    converter[runeValue] = runeValue
}
fmt.Println(converter)

但由于runeint32 的别名,打印上面的converter 映射将打印整数,输出将是:

map[8984:8984 12371:12371 12385:12385 12395:12395 12399:12399 12435:12435]

如果要打印字符,请使用fmt.Printf()%c 动词:

fmt.Printf("%c\n", converter)

将输出:

map[⌘:⌘ こ:こ ち:ち に:に は:は ん:ん]

试试Go Playground上的例子。

如果您想替换(切换)string 中的某些符文,请使用 strings.Map() 函数,例如:

sample := "⌘こんにちは"

result := strings.Map(func(r rune) rune {
    if r == '⌘' {
        return 'a'
    }
    if r == 'こ' {
        return 'b'
    }
    return r
}, sample)

fmt.Println(result)

哪些输出(在Go Playground 上试试):

abんにちは

如果您想要由 converter 映射定义的替换:

var converter = map[rune]rune{
    '⌘': 'a',
    'こ': 'b',
}
sample := "⌘こんにちは"

result := strings.Map(func(r rune) rune {
    if c, ok := converter[r]; ok {
        return c
    }
    return r
}, sample)

fmt.Println(result)

这输出相同。在Go Playground 上试试这个。

【讨论】:

    猜你喜欢
    • 2012-05-16
    • 1970-01-01
    • 2011-12-31
    • 2018-04-30
    • 2014-05-26
    • 1970-01-01
    相关资源
    最近更新 更多