bstr是 Rust 的字节字符串库,它的 1.0 版本刚刚发布!它在任意字节序列上提供面向字符串的操作,但当这些字节是 UTF-8 时最有用。换句话说,它提供了一个按照约定是 UTF-8 的字符串类型,而 Rust 的内置字符串类型保证是 UTF-8。 bstr本博客将简要描述 API,深入探讨创建bstr. 目标受众:具有一定 UTF-8 背景知识的 Rust 程序员。
bstr crate主要通过定义两个扩展特性,ByteSlice和ByteVec,为标准库的&[u8]和Vec
演示子字符串搜索的示例。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..."[..]. } |