Rust UCS2编解码库ucs2的使用:高效处理UTF-16与UCS-2编码转换

Rust UCS2编解码库ucs2的使用:高效处理UTF-16与UCS-2编码转换

UCS2 crate on crates.io UCS2 docs on docs.rs Licensed under MPL-2.0

用于Rust的UCS-2处理库。

请注意,UCS-2是UTF-16的前身。它是一种固定长度编码,用于UEFI等场景。

历史

这个crate源于uefi-rs crate的需求。代码被提取并放置在这里以便于维护和重用。

大部分初始代码由FredrikAleksander贡献。

许可证

根据Mozilla公共许可证2.0授权。

安装

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

cargo add ucs2

或者在Cargo.toml中添加以下行:

ucs2 = "0.3.3"

完整示例代码

use ucs2;

fn main() {
    // 示例1: 将字符串编码为UCS-2字节序列
    let text = "Hello, 世界!";
    
    // 编码字符串为UCS-2字节序列
    let encoded = ucs2::encode(text).expect("Failed to encode string");
    println!("Encoded bytes: {:?}", encoded);
    
    // 示例2: 将UCS-2字节序列解码为字符串
    let decoded = ucs2::decode(&encoded).expect("Failed to decode bytes");
    println!("Decoded text: {}", decoded);
    
    // 示例3: 处理UCS-2字节迭代器
    let mut encoder = ucs2::Encoder::new();
    for c in text.chars() {
        if let Some(bytes) = encoder.encode_char(c) {
            println!("Character '{}' encoded as: {:?}", c, bytes);
        }
    }
    
    // 示例4: 检查字符串是否可以被UCS-2完全表示
    let can_encode = ucs2::can_encode(text);
    println!("Can fully encode '{}': {}", text, can_encode);
}

使用说明

该库提供了以下主要功能:

  1. 编码功能:将UTF-8字符串编码为UCS-2字节序列
  2. 解码功能:将UCS-2字节序列解码为UTF-8字符串
  3. 字符检查:验证字符是否可以在UCS-2中表示
  4. 迭代器支持:支持逐个字符的编码和解码操作

注意事项

  • UCS-2是固定长度编码,每个字符使用2个字节
  • 与UTF-16不同,UCS-2不支持代理对,因此无法表示U+10000及以上的Unicode字符
  • 主要用于UEFI等需要固定长度编码的场景

文档

详细的API文档可在docs.rs上查看。

完整示例demo

use ucs2;

fn main() {
    // 示例1: 基本编码和解码操作
    let sample_text = "Rust UCS2编码测试 🦀";
    
    println!("=== 基本编码解码示例 ===");
    println!("原始文本: {}", sample_text);
    
    // 编码为UCS-2字节序列
    match ucs2::encode(sample_text) {
        Ok(encoded_bytes) => {
            println!("编码后的字节: {:?}", encoded_bytes);
            println!("编码字节长度: {} bytes", encoded_bytes.len());
            
            // 解码回字符串
            match ucs2::decode(&encoded_bytes) {
                Ok(decoded_text) => {
                    println!("解码后的文本: {}", decoded_text);
                    println!("编解码结果一致: {}", sample_text == decoded_text);
                }
                Err(e) => println!("解码失败: {}", e),
            }
        }
        Err(e) => println!("编码失败: {}", e),
    }
    
    println!("\n=== 字符级编码示例 ===");
    // 示例2: 逐个字符编码
    let mut encoder = ucs2::Encoder::new();
    for c in sample_text.chars() {
        if let Some(bytes) = encoder.encode_char(c) {
            println!("字符 '{}' (U+{:04X}) -> UCS-2编码: {:?}", c, c as u32, bytes);
        } else {
            println!("字符 '{}' (U+{:04X}) -> 无法用UCS-2表示", c, c as u32);
        }
    }
    
    println!("\n=== 编码能力检查 ===");
    // 示例3: 检查字符串是否可完全编码
    let test_strings = [
        "ASCII only",
        "中文测试",
        "Emoji测试 🚀",
        "High Unicode 𠀀"
    ];
    
    for test_str in test_strings.iter() {
        let can_encode = ucs2::can_encode(test_str);
        println!("文本 '{}' 可完全编码: {}", test_str, can_encode);
        
        if !can_encode {
            // 找出无法编码的字符
            for c in test_str.chars() {
                if !ucs2::can_encode_char(c) {
                    println!("  无法编码的字符: '{}' (U+{:04X})", c, c as u32);
                }
            }
        }
    }
    
    println!("\n=== 错误处理示例 ===");
    // 示例4: 处理无效的UCS-2字节序列
    let invalid_bytes = vec![0xD8, 0x00, 0xDC, 0x00]; // 无效的代理对
    
    match ucs2::decode(&invalid_bytes) {
        Ok(decoded) => println!("解码成功: {}", decoded),
        Err(e) => println!("解码错误: {}", e),
    }
}

这个完整的示例演示了ucs2库的主要功能,包括:

  1. 基本的字符串编码和解码操作
  2. 逐个字符的编码处理
  3. 编码能力的检查和验证
  4. 错误处理机制
  5. 对Unicode字符范围的支持检查

运行此示例将展示如何处理各种类型的文本,包括ASCII、中文、Emoji以及超出UCS-2范围的字符。


1 回复

Rust UCS2编解码库ucs2的使用指南

概述

ucs2是一个专门用于处理UCS-2和UTF-16编码转换的Rust库,提供了高效的编码解码功能,特别适合处理遗留系统和特定协议中的UCS-2编码数据。

安装方法

在Cargo.toml中添加依赖:

[dependencies]
ucs2 = "0.1"

核心功能

1. 字符串编码

use ucs2;

fn main() {
    let text = "Hello 世界";
    let encoded = ucs2::encode(text).unwrap();
    println!("编码结果: {:?}", encoded);
}

2. 字节解码

use ucs2;

fn main() {
    let bytes: Vec<u8> = vec![0x48, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6F, 0x00];
    let decoded = ucs2::decode(&bytes).unwrap();
    println!("解码结果: {}", decoded);
}

3. 处理UCS-2字节流

use ucs2;

fn process_ucs2_data(data: &[u8]) -> Result<String, ucs2::Error> {
    ucs2::decode_with_bom(data)
}

fn main() {
    let ucs2_data = include_bytes!("data.ucs2");
    match process_ucs2_data(ucs2_data) {
        Ok(text) => println!("处理结果: {}", text),
        Err(e) => println!("处理错误: {:?}", e),
    }
}

高级用法

批量处理

use ucs2;

fn batch_encode(strings: Vec<&str>) -> Vec<Vec<u8>> {
    strings.into_iter()
        .filter_map(|s| ucs2::encode(s).ok())
        .collect()
}

fn main() {
    let texts = vec!["文本1", "text2", "另一个文本"];
    let encoded_data = batch_encode(texts);
    println!("批量编码结果: {:?}", encoded_data);
}

错误处理

use ucs2;

fn safe_decode(bytes: &[u8]) -> Result<String, String> {
    ucs2::decode(bytes)
        .map_err(|e| format!("解码失败: {:?}", e))
}

fn main() {
    let invalid_data = vec![0xFF, 0xFF]; // 无效的UCS-2数据
    match safe_decode(&invalid_data) {
        Ok(text) => println!("成功: {}", text),
        Err(e) => println!("错误: {}", e),
    }
}

完整示例demo

// 完整UCS2编解码示例
use ucs2;

fn main() {
    // 示例1: 字符串编码
    println!("=== 字符串编码示例 ===");
    let text = "Hello UCS2 编码测试";
    match ucs2::encode(text) {
        Ok(encoded) => {
            println!("原始文本: {}", text);
            println!("编码结果: {:?}", encoded);
        }
        Err(e) => println!("编码错误: {:?}", e),
    }

    println!("\n=== 字节解码示例 ===");
    // 示例2: 字节解码
    let ucs2_bytes = vec![
        0x48, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6F, 0x00, // Hello
        0x20, 0x00, // 空格
        0x57, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6C, 0x00, 0x64, 0x00  // World
    ];
    
    match ucs2::decode(&ucs2_bytes) {
        Ok(decoded) => {
            println!("UCS2字节: {:?}", ucs2_bytes);
            println!("解码文本: {}", decoded);
        }
        Err(e) => println!("解码错误: {:?}", e),
    }

    println!("\n=== 批量处理示例 ===");
    // 示例3: 批量编码
    let texts = vec!["第一个文本", "second text", "第三段文字内容"];
    let encoded_results: Vec<Vec<u8>> = texts.iter()
        .filter_map(|s| ucs2::encode(s).ok())
        .collect();
    
    for (i, encoded) in encoded_results.iter().enumerate() {
        println!("文本{}编码结果: {:?}", i + 1, encoded);
    }

    println!("\n=== 错误处理示例 ===");
    // 示例4: 错误处理
    let invalid_bytes = vec![0xFF, 0xFF, 0x00, 0xD8]; // 无效的UCS-2数据
    
    match ucs2::decode(&invalid_bytes) {
        Ok(text) => println!("解码成功: {}", text),
        Err(e) => println!("预期中的解码错误: {:?}", e),
    }

    println!("\n=== 带BOM处理示例 ===");
    // 示例5: 带BOM标记的数据处理
    let data_with_bom = vec![0xFF, 0xFE, 0x48, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6F, 0x00];
    
    match ucs2::decode_with_bom(&data_with_bom) {
        Ok(text) => println!("带BOM解码结果: {}", text),
        Err(e) => println!("BOM处理错误: {:?}", e),
    }
}

// 高级用法:自定义错误处理函数
fn robust_ucs2_decode(data: &[u8]) -> Result<String, String> {
    ucs2::decode(data)
        .map_err(|e| match e {
            ucs2::Error::OddLength => "数据长度不是偶数".to_string(),
            ucs2::Error::InvalidChar => "包含无效UCS-2字符".to_string(),
            _ => "未知解码错误".to_string(),
        })
}

// 高级用法:流式处理函数
fn stream_ucs2_processor(chunks: Vec<Vec<u8>>) -> Vec<String> {
    chunks.into_iter()
        .filter_map(|chunk| ucs2::decode(&chunk).ok())
        .collect()
}

性能提示

  • 对于大量数据处理,建议复用编码器实例
  • 使用decode_with_bom自动处理字节顺序标记
  • 考虑使用迭代器模式处理流式数据

注意事项

  • UCS-2不支持Unicode增补平面字符(代码点大于0xFFFF)
  • 在处理未知数据时始终检查解码结果
  • 注意字节序问题,特别是在跨平台应用中

这个库为处理传统的UCS-2编码数据提供了简单高效的解决方案,特别适合与遗留系统交互和处理特定协议数据。

回到顶部