#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/ISPOEvSzFQW2. A
string
не является arune
, оно может содержать несколькоrune
s .for range
Итерация выполняется по ее рунам, или вы можете использовать преобразование, подобное[]rune(sample)
получению всех рун astring
в виде среза. В чем именно заключается ваш вопрос?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("пример")