【问题标题】:How to iterate over Unicode grapheme clusters in Rust?如何在 Rust 中迭代 Unicode 字素簇?
【发布时间】:2020-03-05 07:36:04
【问题描述】:

我正在学习 Rust,但令我惊讶的是,Rust 只能区分 UTF-8 字节序列,但不能区分实际的字形簇(即变音符号被视为不同的“字符”)。

例如,Rust 可以将输入文本转换为这样的向量(在 "नमस्ते".chars() 的帮助下):

['न', 'म', 'स', '्', 'त', 'े'] // 4 and 6 are diacritics and shouldn't be distinct items

但是我怎样才能得到这样的向量呢?

["न", "म", "स्", "ते"]

【问题讨论】:

标签: unicode utf-8 rust


【解决方案1】:

你想使用the unicode-segmentation crate:

use unicode_segmentation::UnicodeSegmentation; // 1.5.0

fn main() {
    for g in "नमस्ते्".graphemes(true) {
        println!("- {}", g);
    }
}

(Playground,注意:playground编辑器无法正确处理字符串,所以这一行光标位置不对)

打印出来:

- न
- म
- स्
- ते्

true 作为参数意味着我们要迭代扩展的字形簇。请参阅graphemes documentation 了解更多信息。


标准库在某些时候支持分割成 Unicode 字素簇,但不幸的是,由于所需的 Unicode 表的大小,它是deprecated,然后是removed。相反,事实上的解决方案是使用板条箱。但是,是的,我认为“默认标准库分段”使用的代码点在语义上没有多大意义(即计算它们或将它们拆分通常没有意义),这真的很不幸。

【讨论】:

  • @Nurbol Alpysbayev 让我知道我是否正确复制了字符串以及结果是否正确。不幸的是,我不理解这个脚本,也无法真正将它与您的预期结果进行比较。
  • 啊,所以使用 crate 是事实上的标准吗?坦率地说,我搜索了一些板条箱但没有成功。太感谢了!这正是我需要的!
  • @NurbolAlpysbayev 我添加了一些关于它是事实上的解决方案的解释。
猜你喜欢
  • 1970-01-01
  • 2017-07-15
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 2022-11-09
相关资源
最近更新 更多