Rust精确字符串处理库precis-tools的使用,支持Unicode标准化和精确字符串匹配

Rust精确字符串处理库precis-tools的使用,支持Unicode标准化和精确字符串匹配

precis-tools是一个用于从Unicode字符数据库(UCD)生成PRECIS表的工具和解析器库。该库主要用于生成代码,供其他crate如precis-core或precis-profiles使用。

安装

在项目目录中运行以下Cargo命令:

cargo add precis-tools

或在Cargo.toml中添加:

precis-tools = "0.1.9"

许可证

该项目采用以下许可证之一:

  • Apache License, Version 2.0
  • MIT license

完整示例代码

以下是使用precis-tools进行Unicode标准化和精确字符串匹配的示例:

use precis_tools::PrecisTools;

fn main() {
    // 初始化PRECIS工具
    let precis = PrecisTools::new();
    
    // 示例字符串
    let input = "Hello 世界 😊";
    
    // Unicode标准化处理
    let normalized = precis.normalize(input).expect("Normalization failed");
    println!("Normalized string: {}", normalized);
    
    // 精确字符串匹配比较
    let other_input = "hello 世界 😊";
    if precis.compare(input, other_input).unwrap_or(false) {
        println!("Strings match precisely");
    } else {
        println!("Strings do not match");
    }
}

特性说明

  1. 支持从Unicode字符数据库生成PRECIS表
  2. 提供Unicode标准化功能
  3. 实现精确字符串匹配比较
  4. 主要用于代码生成,供其他PRECIS相关库使用

贡献

欢迎提交补丁和反馈。

维护者

Santiago Carot-Nemesio

分类

  • 文本处理
  • 国际化(i18n)

完整示例demo

基于上述示例,下面是一个更完整的演示代码,展示了precis-tools的更多功能:

use precis_tools::PrecisTools;

fn main() {
    // 初始化PRECIS工具实例
    let precis = PrecisTools::new();
    
    // 演示字符串1 - 包含混合Unicode字符
    let str1 = "Rust编程 🦀 2023";
    // 演示字符串2 - 大小写不同但内容相似的字符串
    let str2 = "rust编程 🦀 2023";
    
    // 字符串标准化演示
    println!("=== 字符串标准化演示 ===");
    match precis.normalize(str1) {
        Ok(norm_str) => println!("标准化结果: {}", norm_str),
        Err(e) => println!("标准化失败: {}", e),
    }
    
    // 字符串精确比较演示
    println!("\n=== 字符串精确比较演示 ===");
    match precis.compare(str1, str2) {
        Ok(true) => println!("字符串精确匹配"),
        Ok(false) => println!("字符串不匹配"),
        Err(e) => println!("比较出错: {}", e),
    }
    
    // 演示处理可能无效的Unicode输入
    println!("\n=== 错误处理演示 ===");
    let invalid_str = "Hello\xFFWorld"; // 包含无效UTF-8序列
    match precis.normalize(invalid_str) {
        Ok(norm_str) => println!("标准化结果: {}", norm_str),
        Err(e) => println!("错误: {}", e),
    }
}

1 回复

Rust精确字符串处理库precis-tools使用指南

概述

precis-tools是一个Rust库,专门用于Unicode标准化和精确字符串处理。它实现了PRECIS框架(Preparedness Comparison of Internationalized Strings),适用于需要精确字符串比较和处理的场景,如用户名、密码、标识符等的规范化处理。

主要功能

  • Unicode标准化处理
  • 精确字符串匹配
  • 支持多种PRECIS配置文件
  • 字符串宽度映射和大小写处理

安装方法

在Cargo.toml中添加依赖:

[dependencies]
precis-tools = "0.4"

基本使用方法

1. 字符串规范化

use precis_tools::profile::UsernameCaseMapped;
use precis_tools::Profile;

let input = "UsErNaMe123";
let normalized = UsernameCaseMapped::prepare(input).unwrap();
println!("{}", normalized);  // 输出: username123

2. Unicode标准化

use precis_tools::profile::OpaqueString;
use precis_tools::Profile;

let input = "Héllo\u{0301}";  // 组合字符
let normalized = OpaqueString::prepare(input).unwrap();
println!("{}", normalized);  // 输出: Hélló (标准化形式)

3. 精确字符串比较

use precis_tools::profile::UsernameCaseMapped;
use precis_tools::Profile;

let str1 = "USER";
let str2 = "user";

let prepared1 = UsernameCaseMapped::prepare(str1).unwrap();
let prepared2 = UsernameCaseMapped::prepare(str2).unwrap();

assert_eq!(prepared1, prepared2);  // 比较结果为相等

高级用法

1. 使用不同的PRECIS配置文件

use precis_tools::profile::{UsernameCaseMapped, UsernameCasePreserved, OpaqueString};

// 大小写保留的用户名
let case_preserved = UsernameCasePreserved::prepare("UsErNaMe").unwrap();

// 不透明字符串(如密码)
let password = OpaqueString::prepare("P@ssw0rd").unwrap();

2. 自定义处理

use precis_tools::profile::Profile;
use precis_tools::error::PrecisError;

struct MyCustomProfile;
impl Profile for MyCustomProfile {
    fn prepare(s: &str) -> Result<String, PrecisError> {
        // 自定义处理逻辑
        Ok(s.to_lowercase())
    }
}

let custom = MyCustomProfile::prepare("TEST").unwrap();

错误处理

use precis_tools::profile::UsernameCaseMapped;
use precis_tools::error::PrecisError;

let result = UsernameCaseMapped::prepare("invalid\u{0000}string");
match result {
    Ok(s) => println!("Valid string: {}", s),
    Err(PrecisError::BadCodepoint(_)) => eprintln!("String contains invalid characters"),
    Err(e) => eprintln!("Other error: {:?}", e),
}

完整示例代码

下面是一个使用precis-tools的完整示例,展示了用户名处理和密码处理:

use precis_tools::profile::{UsernameCaseMapped, UsernameCasePreserved, OpaqueString};
use precis_tools::{Profile, Error as PrecisError};

fn main() {
    // 示例1: 用户名处理(大小写映射)
    let username_input = "AdminUser123";
    match UsernameCaseMapped::prepare(username_input) {
        Ok(normalized) => println!("规范化用户名: {}", normalized),  // 输出: adminuser123
        Err(e) => eprintln!("用户名处理错误: {:?}", e),
    }

    // 示例2: 用户名处理(保留大小写)
    let case_preserved_username = "AdminUser123";
    match UsernameCasePreserved::prepare(case_preserved_username) {
        Ok(normalized) => println!("保留大小写的用户名: {}", normalized),  // 输出: AdminUser123
        Err(e) => eprintln!("用户名处理错误: {:?}", e),
    }

    // 示例3: 密码处理
    let password_input = "P@ssw0rd\u{202E}";  // 包含Unicode双向控制字符
    match OpaqueString::prepare(password_input) {
        Ok(normalized) => println!("规范化密码: {}", normalized),
        Err(PrecisError::BadCodepoint(_)) => eprintln!("密码包含无效字符"),
        Err(e) => eprintln!("密码处理错误: {:?}", e),
    }

    // 示例4: 用户输入验证
    validate_user_input("NewUser", "Str0ngP@ss");
}

fn validate_user_input(username: &str, password: &str) {
    println!("\n验证用户输入:");
    println!("原始用户名: {}", username);
    println!("原始密码: {}", password);

    // 规范化用户名(大小写不敏感)
    let normalized_username = match UsernameCaseMapped::prepare(username) {
        Ok(u) => u,
        Err(e) => {
            eprintln!("无效用户名: {:?}", e);
            return;
        }
    };

    // 规范化密码
    let normalized_password = match OpaqueString::prepare(password) {
        Ok(p) => p,
        Err(e) => {
            eprintln!("无效密码: {:?}", e);
            return;
        }
    };

    println!("有效用户名: {}", normalized_username);
    println!("有效密码: {}", normalized_password);
}

应用场景

  • 用户注册系统处理用户名和密码
  • 国际化标识符的标准化
  • 需要精确字符串匹配的安全系统
  • 处理包含Unicode字符的标识符

precis-tools通过实现PRECIS框架,为Rust开发者提供了强大而灵活的国际化字符串处理能力,特别适合需要严格字符串处理的应用程序。

回到顶部