Как преобразовать строку в руну?

#string #go #character-encoding #rune

# #строка #Вперед #кодировка символов #rune

Вопрос:

Вот мой фрагмент кода:

 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'
 

Это значение буквально rune, но поскольку возвращаемый тип Sprintf является string , я не могу использовать его в своей карте, которая есть [rune]rune .
Мне было интересно, как я могу преобразовать строку в rune или, другими словами, как я могу справиться с этой проблемой?

Комментарии:

1. []rune(sample) ? как в play.golang.org/p/ISPOEvSzFQW

2. A string не является a rune , оно может содержать несколько rune s . for range Итерация выполняется по ее рунам, или вы можете использовать преобразование, подобное []rune(sample) получению всех рун a string в виде среза. В чем именно заключается ваш вопрос?

3. спасибо @mh-cbon. Я не хочу просто печатать их на консоли, но я хочу использовать значения в моей карте.

4. Спасибо @icza, ты знаешь, что я хочу сопоставить некоторые значения рун с другими значениями рун. Таким образом, используя range поверх строки, я хочу взять каждый rune и использовать его на своей карте, чтобы найти соответствующий rune . кстати, я пытаюсь реализовать кодировку символов

5. @icze, но моя проблема в том, как взять эту руну. Следуя приведенному здесь совету Роба Пайка, я использовал "% q" каждую руну, но Sprintf возвращал ее в виде строки. Мне было интересно, есть ли другой способ, который я могу использовать "% q" и возвращает как руну

Ответ №1:

A string не является единичным rune , оно может содержать несколько runes . Вы можете использовать простое преобразование типов, чтобы преобразовать a string в a []runes , содержащий все его подобные руны []rune(sample) .

for range Итерация выполняется по рунам a string , поэтому в вашем примере runeValue имеет тип 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 глагол fmt.Printf() :

 fmt.Printf("%cn", converter)
 

Который выведет:

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

Попробуйте примеры на игровой площадке Go.

Если вы хотите заменить (переключить) определенные руны в 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):

 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.

Ответ №2:

Преобразовать строку в массив рун:

runeArray := []rune("пример")