bstr:Rust 的字节字符串库

22-10-07 banq

bstr是 Rust 的字节字符串库,它的 1.0 版本刚刚发布!它在任意字节序列上提供面向字符串的操作,但当这些字节是 UTF-8 时最有用。换句话说,它提供了一个按照约定是 UTF-8 的字符串类型,而 Rust 的内置字符串类型保证是 UTF-8。
bstr本博客将简要描述 API,深入探讨创建bstr.
目标受众:具有一定 UTF-8 背景知识的 Rust 程序员。

bstr crate主要通过定义两个扩展特性,ByteSlice和ByteVec,为标准库的&[u8]和Vec<u8>类型增加面向字符串的方法。

演示子字符串搜索的示例。needle 和 haystack 都可以是任意字节,就像经典的 Cmemmem 例程一样:

use bstr::ByteSlice;

fn main() {
    let haystack = b"foo bar foo\xFF\xFFfoo quux foo";

    let mut matches = vec![];
    for start in haystack.find_iter("foo") {
        matches.push(start);
    }
    assert_eq!(matches, [0, 8, 13, 22]);
}


这利用了ByteSlice::find_iter方法。与标准库不同,bstr它没有定义多态子字符串搜索 API,而是使事情更加具体。例如,要搜索 一个char,您可以使用ByteSlice::find_char方法。

这是另一个演示 Unicode 感知大写的示例,但在不是有效 UTF-8 的文本上。

use bstr::{B, ByteSlice};

fn main() {
    // \xCE\xB2 is the UTF-8 encoding of β.
    let lower = b"\xFF hello \xCE\xB2";
    let upper = lower.to_uppercase();
    // \xCE\x92 is the UTF-8 encoding of Β
    assert_eq!(B(b"\xFF HELLO \xCE\x92"), upper);
   // 为什么在这里使用'B'?因为否则它的类型是&[u8; N]并且
   //没有PartialEq内含用于它和Vec<u8>。另一种方法是
    // write it would have been &b"\xFF HEL..."[..].
}

上面的例子表明,无效的 UTF-8 实际上并不能阻止人们对字符串中有效的 UTF-8 部分应用 Unicode 感知算法。UTF-8 无效的部分将被忽略。