1.0.0 |
|
---|---|
0.1.5 |
|
#11 in #code-point
305KB
707 行
UTF-8缓冲读取器
这个crate提供了通过一个名为BufRead
的特质从任何实现了该特质的数据类型中读取utf-8文本的函数,而不需要等待换行符分隔符。这些函数利用缓冲区,要么返回字符串(str
),要么返回字符(char
)。每个都有一个关联的迭代器,其中一些有一个类似于Map
迭代器的等效物,避免了分配和克隆。
使用方法
在您的Cargo.toml
中添加此crate作为依赖项
[dependencies]
utf8-bufread = "1.0.0"
使用此crate读取文件的简单方法可能如下所示
// Reader may be any type implementing io::BufRead
// We'll just use a cursor wrapping a slice for this example
let mut reader = Cursor::new("Löwe 老虎 Léopard");
loop { // Loop until EOF
match reader.read_str() {
Ok(s) => {
if s.is_empty() {
break; // EOF
}
// Do something with `s` ...
print!("{}", s);
}
Err(e) => {
// We should try again if we get interrupted
if e.kind() != ErrorKind::Interrupted {
break;
}
}
}
}
读取任意长度的字符串切片
read_str
函数返回从内部读取器读取的任意长度字符串切片(最多为读取器缓冲区容量),无需克隆数据,除非有效的码点在读取器缓冲区末尾被截断。其关联的迭代器可以通过调用str_iter
获得,由于它涉及在每个迭代中克隆数据,因此还提供了str_map
。
读取码点
read_char
函数返回从内部读取器读取的字符。其关联的迭代器可以通过调用char_iter
获得。
迭代器类型
这个crate提供了一些结构体,用于以多种方式迭代内部读取器的数据
StrIter
和CodepointIter
在每次迭代时都会克隆数据,但使用Rc
来检查返回的String
缓冲区是否还被使用。如果没有,则重新使用以避免重新分配。
let mut reader = Cursor::new("Löwe 老虎 Léopard");
for s in reader.str_iter().filter_map(|r| r.ok()) {
// Do something with s ...
print!("{}", s);
}
StrMap
和CodepointMap
允许在不分配或复制的情况下读取数据,但之后无法将其传递给进一步的迭代器适配器。
let s = "Löwe 老虎 Léopard";
let mut reader = Cursor::new(s);
let count: usize = reader
.str_map(|s| s.len())
.filter_map(Result::ok)
.sum();
println!("There is {} valid utf-8 bytes in {}", count, s);
let s = "Löwe 老虎 Léopard";
let mut reader = Cursor::new(s);
let count = reader
.char_iter()
.filter_map(Result::ok)
.filter(|c| c.is_lowercase())
.count();
assert_eq!(count, 9);
所有这些迭代器都可能读取数据直到 EOF 或找到无效的码点。如果从内部读取器读取了有效码点,它们会 在 报告错误之前将它们返回。在遇到错误或 EOF 之后,它们总是返回 None
(选项)。它们总是忽略任何 Interrupted
错误。
进行中
这个 crate 仍在进行中。其 API 的一部分可以被认为是稳定的
read_str
、read_codepoint
和read_char
的行为和签名。str_iter
、str_map
、codepoints_iter
、codepoints_map
和char_iter
的行为和签名。StrIter
、StrMap
、CodepointIter
、CodepointMap
和CharIter
的 API。
然而,一些功能仍被视为不稳定
还有一些特性需要添加
read_*
的有损和不检查版本(见from_utf8_lossy
&from_utf8_unchecked
)。- (可选)使用
unicode-segmentation
crate 支持图形簇,方式与read_codepoint
相同。 - 我欢迎建议,如果你有想法 😉
鉴于我并不是最有经验的开发者,你非常欢迎在此提交问题和推送请求 这里
许可
Utf8-BufRead 在 Apache License 2.0 的条款下分发,请参阅此存储库根目录中的 LICENSE 文件。