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);
}

功能特点

  1. 支持Unicode标准定义的双向算法(UAX #9)
  2. 提供字符级别的Bidi分类
  3. 支持段落级别的方向性分析
  4. 能够正确重新排序混合方向的文本
  5. 高效实现,适合处理大量文本

完整示例代码

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()));
    }
}

实际应用场景

  1. 多语言文本编辑器
  2. 国际化应用程序的文本渲染
  3. 命令行工具的多语言支持
  4. 网页内容处理
  5. 移动应用程序的文本布局

许可证

该库采用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();
}

代码说明

  1. 字符方向检测:

    • 使用bidi_class()函数检测单个字符的书写方向
    • 展示拉丁字母、希伯来字母、数字和符号的方向类别
  2. 段落处理:

    • 处理纯LTR、纯RTL和混合方向的文本
    • 使用BidiInfo::new()分析文本双向性
    • 使用reorder_line()获取正确显示顺序的文本
  3. 高级用法:

    • 强制指定段落方向(覆盖自动检测)
    • 处理包含隔离运行(FSI/PDI)的文本
    • 展示Unicode控制字符对文本方向的影响

性能提示

  1. 重用BidiInfo实例避免重复解析
  2. 简单场景使用BidiClass::of()替代完整解析
  3. 已知方向时直接指定可提升性能

总结

这个完整示例展示了unic-ucd-bidi库的核心功能,从基础字符检测到复杂文本处理。该库特别适合需要处理多语言混合文本的国际化应用,能正确处理从简单到复杂的各种双向文本场景。

回到顶部