11 个稳定版本
1.6.0 | 2023 年 3 月 4 日 |
---|---|
1.5.3 | 2023 年 2 月 26 日 |
1.5.0 | 2023 年 1 月 28 日 |
1.4.7 | 2022 年 12 月 18 日 |
1494 在 文本处理 中排名
29 每月下载量
52KB
643 行
Text-Sanitizer
Rust crate,用于将原始文本字节转换为具有纯 ASCII 编码的 std::str::String
特性
- 非常低的依赖性
这导致- 高兼容性(即使在旧 Rust 编译器上也能编译)
- 非常快的启动时间(在 27KB 文档上的执行时间少于 3 毫秒)
- 健壮的代码(不使用风险较高的
unwrap()
方法)
采用 DevOps 态度开发:“可能会失败,但会存活下来讲述”
动机
大多数 Rust 解析库在遇到未使用 UTF-8 编码的原始数据(如 ISO-8859-15 Windows 编码和其他混合编码)时都会放弃。
使用 Str::from_utf8_lossy()
将会破坏这些数据,并且包含字节级别的线性往返解析,这在处理大数据时会引入性能惩罚。
text-sanitizer
不依赖于正确的编码检测,仅依赖于内部可定制的转换映射。
用法
面向对象方法
当执行多个清理操作时,转换映射可以重复使用。
这更加节省资源,并且还会带来微优化。例如,Web 服务器可以从中受益。
//-------------------------------------
// Test data is the Sparkle Heart from the UTF-8 documentation examples
use text_sanitizer::TextSanitizer;
let vsparkle_heart = vec![240, 159, 146, 150];
let mut sanitizer = TextSanitizer::new_with_options(false, true, false);
sanitizer.add_request_language(&"en");
let srsout = sanitizer.sanitize_u8(&vsparkle_heart);
println!("sparkle_heart: '{}'", srsout);
assert_eq!(srsout, "<3");
过程式方法
sanitizer::sanitize_u8()
函数接受原始数据,并从中创建一个新的有效的 UTF-8 std::str::String
use text_sanitizer::sanitizer;
fn sparkle_heart() {
//-------------------------------------
// Test data is the Sparkle Heart from the UTF-8 documentation examples
// which will be converted to " <3 ".
let vsparkle_heart = vec![240, 159, 146, 150];
let vrqlngs: Vec<String> = vec![String::from("en")];
let srsout = sanitizer::sanitize_u8(&vsparkle_heart, &vrqlngs, &"");
println!("sparkle_heart: '{}'", srsout);
assert_eq!(srsout, "<3");
}
考虑以下示例,其中中间的数据被某种方式损坏:这些数据不能被普通的 Rust 库解析,其中包含的有效信息将会丢失。
use text_sanitizer::sanitizer;
fn two_hearts_center() {
//-------------------------------------
// Test data contains 2 Sparkle Hearts but is corrupted in the center
// According to the Official Standard Library Documentation at:
// https://doc.rust-lang.net.cn/std/string/struct.String.html#method.from_utf8
// this would produce a FromUtf8Error or panic the application
// when used with unwrap()
let vsparkle_heart = vec![240, 159, 146, 150, 119, 250, 240, 159, 146, 150];
let vrqlngs: Vec<String> = vec![String::from("en")];
let srsout = sanitizer::sanitize_u8(&vsparkle_heart, &vrqlngs, &" -d");
println!("sparkle_heart: '{}'", srsout);
assert_eq!(srsout, "<3w(?fa)<3");
}
依赖性
~2MB
~46K SLoC