如何解码单个UTF-8字符并仅使用Rust标准库跳到下一个字符?

时间:2017-01-04 17:18:26

标签: utf-8 rust

Rust是否提供了从&[u8]解码单个字符(确切地说是unicode-scalar-value)的方法,该字符可能是多个字节,返回单个USV?< / p>

像GLib的g_utf8_get_char&amp; g_utf8_next_char

// Example of what glib's functions might look like once ported to Rust.
let i = 0;
while i < slice.len() {
    let unicode_char = g_utf8_get_char(&slice[i..]);

    // do something with the unicode character
    funcion(unicode_char);

    // move onto the next.
    i += g_utf8_next_char(&slice[i..]);
}

除了将一些GLib API移植到Rust之外,Rust还提供了一种方法来实现这一点,除了一些试验和错误调用from_utf8,一旦到达第二个字符就会停止?

请参阅GLib's code

2 个答案:

答案 0 :(得分:2)

不,从Rust 1.14开始,Rust标准库中没有公开这样的功能。

并且都不应该。 Rust在一个巨大的标准库中不会相信。使用Crates是微不足道的,可以防止人们重写代码。许多人的意见不正确(是的,这是正确的:意见不正确),使用依赖关系会使他们的程序变弱。

标准库中的任何内容都必须保持永久。对于破坏向后兼容性的Rust 2.0没有零计划。 Python就是这里的常见示例,标准库中存在大量“从URL获取数据”部分,这些部分都是冗余的,现在已弃用。 Python维护者不得不浪费时间来保持这些工作,而不是推进语言。

第三方包装箱允许在不增加整个语言负担的情况下创建,发展和消亡。

答案 1 :(得分:0)

您可以使用str::from_utf8将字节切片(&[u8])转换为字符串切片(&str)(请注意,这会验证整个字节切片是有效的UTF-8) 。然后,您可以使用字符串切片上的chars()迭代器来迭代字符串中的每个字符(char)。