我正在学习Rust,我只是惊讶于Rust只能够区分UTF-8字节序列,而不能区分实际的图形群(即,变音符号被认为是一个独特的"字符").

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

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

但如何得到这样的向量呢?

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

推荐答案

您想使用the unicode-segmentation crate:

use unicode_segmentation::UnicodeSegmentation; // 1.5.0

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

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

这张照片是:

- न
- म
- स्
- ते्

true as参数意味着我们要迭代扩展的grapheme集群.更多信息请参见graphemes documentation.


标准库在某种程度上支持对Unicode grapheme集群进行分段,但不幸的是,由于所需的Unicode表的大小,分段为deprecated,然后是removed.事实上的解决办法是使用 crate .但是,是的,我认为"默认标准库分段"使用的代码点在语义上没有太多意义(即,计算它们或将它们拆分通常没有意义),这真的很不幸.

Rust相关问答推荐

Box::new()会从一个堆栈复制到另一个堆吗?

自定义结果枚举如何支持`?`/`FromResidual`?

告诉Rust编译器返回值不包含构造函数中提供的引用

有没有一种惯用的方法来判断VEC中是否存在变体?

为什么';t std::cell::ref使用引用而不是非空?

如何创建一个可变的嵌套迭代器?

为什么Option类型try块需要类型注释?

如何在AVX2中对齐/旋转256位向量?

为什么比较Option<;字符串>;具有常数Option<&;str>;需要显式类型转换吗?

为什么`tokio::main`可以直接使用而不需要任何导入?

如何重命名 clap_derive 中的子命令占位符?

Rust,如何从 Rc> 复制内部值并返回它?

当我try 使用 SKI 演算中的S I I实现递归时,为什么 Rust 会失败?

如何正确使用git2::Remote::push?

为什么 Rust 字符串没有短字符串优化 (SSO)?

&self 参数在 trait 的功能中是必需的吗?

Rust:如果我知道只有一个实例,那么将可变borrow 转换为指针并返回(以安抚borrow 判断器)是否安全?

为什么这个 Trait 无效?以及改用什么签名?

在特征中返回一个 Self 类型的值

有没有比多个 push_str() 调用更好的方法将字符串链接在一起?