我正在学习Rust,我只是惊讶于Rust只能够区分UTF-8字节序列,而不能区分实际的图形群(即,变音符号被认为是一个独特的"字符").
例如,Rust可以将输入文本转换为如下向量(借助"नमस्ते".chars()
):
['न', 'म', 'स', '्', 'त', 'े'] // 4 and 6 are diacritics and shouldn't be distinct items
但如何得到这样的向量呢?
["न", "म", "स्", "ते"]
我正在学习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 .但是,是的,我认为"默认标准库分段"使用的代码点在语义上没有太多意义(即,计算它们或将它们拆分通常没有意义),这真的很不幸.