3

这是我的代码片段:

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。我想知道如何将字符串转换为符文,或者换句话说,我该如何处理这个问题?

4

1 回答 1

6

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

for range迭代 a 的符文,string因此在您的示例runeValue中是 type rune,您可以在converter地图中使用它,例如:

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

但由于rune是 的别名int32,打印上面的converter地图将打印整数,输出将是:

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

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

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

这将输出:

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

试试Go Playground上的示例。

如果要替换(切换) a 中的某些符文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上试试这个。

于 2020-12-08T09:21:06.663 回答