【问题标题】:V: iterate the characters (runes) of a stringV:迭代字符串的字符(符文)
【发布时间】:2020-12-25 02:27:05
【问题描述】:

据我了解,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)
------------------------------

如何获取字符/符文中字符串的长度?如何遍历所有字符/符文而不是字节?

【问题讨论】:

    标签: vlang


    【解决方案1】:

    您可以在字符串上调用.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
    
    
    

    【讨论】:

      【解决方案2】:

      看起来需要使用encoding.utf8 模块:

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

      【讨论】:

      • rune 类型正在开发中。将来这应该可以在不导入单独的编码模块的情况下实现,但不幸的是目前仍在 WIP 中。
      猜你喜欢
      • 2012-10-23
      • 2011-06-03
      • 2014-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      相关资源
      最近更新 更多