Rust双向文本处理库unic-ucd-bidi的使用:支持Unicode双向算法的高效实现
Rust双向文本处理库unic-ucd-bidi的使用:支持Unicode双向算法的高效实现
unic-ucd-bidi是一个Rust库,用于支持Unicode双向算法的高效实现。它属于UNIC项目的一部分,该项目旨在提供完整的Unicode支持。
安装
在项目中添加以下依赖到Cargo.toml:
unic-ucd-bidi = "0.9.0"
或者运行以下Cargo命令:
cargo add unic-ucd-bidi
示例代码
以下是使用unic-ucd-bidi进行双向文本处理的完整示例:
use unic_ucd_bidi::BidiClass;
fn main() {
// 示例1:检查字符的Bidi方向性
let char = 'א'; // 希伯来文字母Alef
let bidi_class = BidiClass::of(char);
println!("字符 '{}' 的Bidi类别是: {:?}", char, bidi_class);
// 示例2:分析字符串的Bidi信息
let text = "Hello שלום 123";
let bidi_info = unic_ucd_bidi::BidiInfo::new(text, None);
// 获取段落方向
let para_level = bidi_info.paragraphs[0].level;
println!("段落方向: {}", if para_level.is_ltr() { "LTR" } else { "RTL" });
// 获取每个字符的Bidi级别
for (i, level) in bidi_info.levels.iter().enumerate() {
let ch = text.chars().nth(i).unwrap();
println!("字符 '{}' 的Bidi级别: {}", ch, level.number());
}
// 示例3:重新排序文本以正确显示
let reordered = bidi_info.reorder_line(0..text.len());
println!("重新排序后的文本: {}", reordered);
}
功能特点
- 支持Unicode标准定义的双向算法(UAX #9)
- 提供字符级别的Bidi分类
- 支持段落级别的方向性分析
- 能够正确重新排序混合方向的文本
- 高效实现,适合处理大量文本
完整示例代码
use unic_ucd_bidi::{BidiClass, BidiInfo};
fn main() {
// 示例1:检查多个字符的Bidi方向性
let chars = ['A', 'א', '1', 'ض'];
for char in chars {
let bidi_class = BidiClass::of(char);
println!("字符 '{}' 的Bidi类别是: {:?}", char, bidi_class);
}
// 示例2:分析复杂字符串的Bidi信息
let complex_text = "Rust编程 语言 - اللغة العربية 123 - עברית";
let bidi_info = BidiInfo::new(complex_text, None);
// 分析多段落文本
for (i, para) in bidi_info.paragraphs.iter().enumerate() {
println!("段落 {} 方向: {}", i+1, if para.level.is_ltr() { "LTR" } else { "RTL" });
// 获取每个字符的Bidi级别
let (start, end) = para.range.clone().into_inner();
for (i, level) in bidi_info.levels[start..end].iter().enumerate() {
let ch = complex_text.chars().nth(start + i).unwrap();
println!("字符 '{}' 的Bidi级别: {}", ch, level.number());
}
// 重新排序段落
let reordered = bidi_info.reorder_line(para.range.clone());
println!("重新排序后的段落 {}: {}", i+1, reordered);
}
// 示例3:处理用户输入
println!("请输入包含混合方向文本的字符串:");
let mut input = String::new();
std::io::stdin().read_line(&mut input).unwrap();
let input_bidi = BidiInfo::new(&input, None);
if let Some(para) = input_bidi.paragraphs.first() {
println!("检测到的文本方向: {}", if para.level.is_ltr() { "LTR" } else { "RTL" });
println!("重新排序后的文本: {}", input_bidi.reorder_line(para.range.clone()));
}
}
实际应用场景
- 多语言文本编辑器
- 国际化应用程序的文本渲染
- 命令行工具的多语言支持
- 网页内容处理
- 移动应用程序的文本布局
许可证
该库采用MIT或Apache-2.0双重许可。
1 回复
Rust双向文本处理库unic-ucd-bidi的使用
介绍
unic-ucd-bidi
是Rust生态中一个专门用于处理Unicode双向文本算法的库。它实现了Unicode标准中的双向算法(UAX #9),用于正确处理包含从左到右(LTR)和从右到左(RTL)文字混合的文本,如阿拉伯语、希伯来语与拉丁字母混合的情况。
该库是UNIC项目(Unicode和国际化Rust组件)的一部分,提供了高效且符合标准的双向文本处理能力。
主要特性
- 完整的Unicode双向算法(UBA)实现
- 支持隔离运行(用于处理嵌入文本)
- 高效的内存使用
- 完全兼容Unicode标准
完整示例代码
// 示例1: 基本字符方向检测
use unic_ucd_bidi::{BidiClass, bidi_class};
fn character_detection() {
let chars = vec!['A', 'ה', '1', '!', 'ض'];
for ch in chars {
println!("字符 '{}' 的Bidi类别: {:?}", ch, bidi_class(ch));
}
}
// 示例2: 段落级别的双向文本处理
use unic_ucd_bidi::BidiInfo;
fn paragraph_processing() {
let texts = vec![
"Hello, world!", // 纯LTR
"مرحبا بالعالم!", // 纯RTL
"Hello, 123 (مرحبا) 456", // 混合文本
"Start: 123 (עִבְרִית) 456 End", // 包含希伯来语
];
for text in texts {
println!("\n处理文本: {}", text);
let bidi_info = BidiInfo::new(text, None);
println!("段落方向: {:?}", bidi_info.paragraphs[0].direction);
println!("重新排序结果: {}", bidi_info.reorder_line(&bidi_info.paragraphs[0], 0..text.len()));
}
}
// 示例3: 高级用法 - 自定义方向和隔离运行
fn advanced_usage() {
// 3.1 强制RTL方向
let ltr_text = "Hello 123";
let bidi_info = BidiInfo::new(ltr_text, Some(unic_ucd_bidi::Level::rtl()));
println!("\n强制RTL结果: {}", bidi_info.reorder_line(&bidi_info.paragraphs[0], 0..ltr_text.len()));
// 3.2 处理隔离运行
let isolated_text = "Text with \u{2068}العربية\u{2069} embedded";
let bidi_info = BidiInfo::new(isolated_text, None);
println!("\n隔离运行处理结果: {}", bidi_info.reorder_line(&bidi_info.paragraphs[0], 0..isolated_text.len()));
}
fn main() {
println!("======== 字符方向检测 ========");
character_detection();
println!("\n======== 段落处理示例 ========");
paragraph_processing();
println!("\n======== 高级用法示例 ========");
advanced_usage();
}
代码说明
-
字符方向检测:
- 使用
bidi_class()
函数检测单个字符的书写方向 - 展示拉丁字母、希伯来字母、数字和符号的方向类别
- 使用
-
段落处理:
- 处理纯LTR、纯RTL和混合方向的文本
- 使用
BidiInfo::new()
分析文本双向性 - 使用
reorder_line()
获取正确显示顺序的文本
-
高级用法:
- 强制指定段落方向(覆盖自动检测)
- 处理包含隔离运行(FSI/PDI)的文本
- 展示Unicode控制字符对文本方向的影响
性能提示
- 重用
BidiInfo
实例避免重复解析 - 简单场景使用
BidiClass::of()
替代完整解析 - 已知方向时直接指定可提升性能
总结
这个完整示例展示了unic-ucd-bidi
库的核心功能,从基础字符检测到复杂文本处理。该库特别适合需要处理多语言混合文本的国际化应用,能正确处理从简单到复杂的各种双向文本场景。