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");
}
}
特性说明
- 支持从Unicode字符数据库生成PRECIS表
- 提供Unicode标准化功能
- 实现精确字符串匹配比较
- 主要用于代码生成,供其他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开发者提供了强大而灵活的国际化字符串处理能力,特别适合需要严格字符串处理的应用程序。