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 每月下载量

Apache-2.0

52KB
643

Automated Tests

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