V: перебирать символы (руны) строки

Насколько я понимаю, строка в V обернута вокруг массива байтов, закодированного как UTF-8. Таким образом, итерация по всем строковым элементам возвращает байты:

fn main() {
    s := 'a string with äöü (umlauts)'
    println(s)
    for i := 0; i < s.len; i++ {
        print('-')
    }
    println('')
}

в результате (обратите внимание на более длинное подчеркивание):

a string with äöü (umlauts)
------------------------------

Как получить длину строки в символах / рунах? Как перебирать все символы / руны вместо байтов?

2 ответа

Вы можете позвонить .runes()метод на строках. Это возвращает массив рун.

Следующий код демонстрирует преобразование строки в массив рун, а затем печатает ее тип и длину.

      fn runes_demo(s string) {
    println(s)
    // Iterate over runes of string
    for _ in s.runes() {
        print('_')
    }
    println('')
    println('Return type of runes(): ${typeof(s.runes()).name}')
    println('Length of string in runes: $s.runes().len')
    println('')
}

fn main() {
    s := 'a string with äöü (umlauts)'
    runes_demo(s)
    t := 'hello there!'
    runes_demo(t)
}

Это выводит следующее:

      a string with äöü (umlauts)
___________________________
Return type of runes(): []rune
Length of string in runes: 27

hello there!
____________
Return type of runes(): []rune
Length of string in runes: 12


Похоже, нужно использовать encoding.utf8 модуль:

import encoding.utf8

fn main() {
    s := 'a string with äöü (umlauts)'
    println(s)
    for i := 0; i < utf8.len(s); i++ {
        print('-')
    }
    println('')
}
Другие вопросы по тегам