如何在Rust中遍历Unicode字素簇?

Nur*_*yev 2 unicode utf-8 rust

我正在学习Rust,而让我感到惊讶的是,Rust仅能够区分UTF-8字节序列,而不能区分实际的字素簇(即,变音符号被视为不同的“字符”)。

因此,例如,Rust可以将输入文本变成这样的矢量(借助于"??????".chars()):

['?', '?', '?', '?', '?', '?'] // 4 and 6 are diacritics and shouldn't be distinct items
Run Code Online (Sandbox Code Playgroud)

但是,如何获得这样的向量?

["?", "?", "??", "??"]
Run Code Online (Sandbox Code Playgroud)

Luk*_*odt 5

你想用unicode-segmentation箱子

use unicode_segmentation::UnicodeSegmentation; // 1.5.0

fn main() {
    for g in "???????".graphemes(true) {
        println!("- {}", g);
    }
}
Run Code Online (Sandbox Code Playgroud)

Playground,请注意:Playground编辑器无法正确处理字符串,因此该行中的光标位置错误)

打印:

- ?
- ?
- ??
- ???
Run Code Online (Sandbox Code Playgroud)

true作为参数意味着我们要遍历扩展字形集群。请参阅graphemes文档以获取更多信息。


标准库在某些时候支持对Unicode字素簇的分段,但是不幸的是,由于所需的Unicode表的大小而将其删除。相反,实际解决方案是使用板条箱。但是,是的,我认为“默认标准库分段”所使用的代码点在语义上没有多大意义(例如,对它们进行计数或将其拆分通常没有任何意义),这确实是很不幸的。

  • @NurbolAlpysbayev 我添加了一些关于它是事实上的解决方案的解释。 (2认同)