Rust HTML实体编码解码库htmlentity的使用,支持HTML字符实体与UTF-8的高效转换

use htmlentity::entity::{encode, decode, EncodeType, CharacterSet, ICodedDataTrait};
use htmlentity::types::{AnyhowResult, Byte};

fn main() -> AnyhowResult<()> {
    // 原始HTML字符串
    let html = "<div name='htmlentity'>Hello!世界!</div>";
    
    // 编码后的字符串
    let html_after_encoded = "&lt;div name='htmlentity'&gt;Hello!&#x4e16;&#x754c;!&lt;/div&gt;";
    
    // 编码示例
    let encoded_data = encode(
        html.as_bytes(), 
        // 编码格式:使用命名实体或十六进制实体
        &EncodeType::NamedOrHex,
        // 需要编码的字符集:HTML特殊字符和非ASCII字符
        &CharacterSet::HtmlAndNonASCII
    );
    
    // 验证编码结果
    assert_eq!(encoded_data.to_bytes(), html_after_encoded.as_bytes());
    assert_eq!(encoded_data.to_string()?, String::from(html_after_encoded));
    
    let char_list = String::from(html_after_encoded).chars().collect::<Vec<char>>();
    assert_eq!(encoded_data.to_chars()?, char_list);
    
    // 解码示例
    let bytes = encoded_data.into_iter().map(|(byte, _)| *byte).collect::<Vec<Byte>>();
    let decoded_data = decode(&bytes);
    
    // 验证解码结果
    assert_eq!(decoded_data.to_bytes(), html.as_bytes());
    assert_eq!(decoded_data.to_string()?, String::from(html));
    
    let char_list = String::from(html).chars().collect::<Vec<char>>();
    assert_eq!(decoded_data.to_chars()?, char_list);
    
    // 快捷用法
    assert_eq!(
        encode(
            html.as_bytes(), 
            &EncodeType::NamedOrHex,
            &CharacterSet::HtmlAndNonASCII,
        ).to_string()?,
        String::from(html)
    );
    
    Ok(())
}

一个用于编码和解码HTML实体的库。

如何使用

use htmlentity::entity::{encode, decode, EncodeType, CharacterSet, ICodedDataTrait};
use htmlentity::types::{AnyhowResult, Byte};

fn main() -> AnyhowResult<()> {
    // 原始HTML字符串
    let html = "<div name='htmlentity'>Hello!世界!</div>";
    
    // 编码后的字符串
    let html_after_encoded = "&lt;div name='htmlentity'&gt;Hello!&#x4e16;&#x754c;!&lt;/div&gt;";
    
    // 编码示例
    let encoded_data = encode(
        html.as_bytes(), 
        // 编码格式:使用命名实体或十六进制实体
        &EncodeType::NamedOrHex,
        // 需要编码的字符集:HTML特殊字符和非ASCII字符
        &CharacterSet::HtmlAndNonASCII
    );
    
    // 验证编码结果
    assert_eq!(encoded_data.to_bytes(), html_after_encoded.as_bytes());
    assert_eq!(encoded_data.to_string()?, String::from(html_after_encoded));
    
    let char_list = String::from(html_after_encoded).chars().collect::<Vec<char>>();
    assert_eq!(encoded_data.to_chars()?, char_list);
    
    // 解码示例
    let bytes = encoded_data.into_iter().map(|(byte, _)| *byte).collect::<Vec<Byte>>();
    let decoded_data = decode(&bytes);
    
    // 验证解码结果
    assert_eq!(decoded_data.to_bytes(), html.as_bytes());
    assert_eq!(decoded_data.to_string()?, String::from(html));
    
    let char_list = String::from(html).chars().collect::<Vec<char>>();
    assert_eq!(decoded_data.to_chars()?, char_list);
    
    // 快捷用法
    assert_eq!(
        encode(
            html.as_bytes(), 
            &EncodeType::NamedOrHex,
            &CharacterSet::HtmlAndNonASCII,
        ).to_string()?,
        String::from(html)
    );
    
    Ok(())
}

许可证

MIT许可证。


1 回复

Rust HTML实体编码解码库htmlentity使用指南

概述

htmlentity是一个高效的Rust库,专门用于HTML字符实体与UTF-8编码之间的转换。该库支持HTML4、HTML5和XML标准中定义的所有字符实体,提供零成本抽象和内存安全保证。

安装方法

在Cargo.toml中添加依赖:

[dependencies]
htmlentity = "0.3"

核心功能

1. 编码功能

将特殊字符转换为HTML实体:

use htmlentity::entity::encode;

fn main() {
    let text = "Hello <World> & 'Rust'";
    let encoded = encode(text);
    println!("{}", encoded); 
    // 输出: Hello &lt;World&gt; &amp; &apos;Rust&apos;
}

2. 解码功能

将HTML实体转换回原始字符:

use htmlentity::entity::decode;

fn main() {
    let html = "&lt;div&gt;Hello &amp; World&lt;/div&gt;";
    let decoded = decode(html).unwrap();
    println!("{}", decoded);
    // 输出: <div>Hello & World</div>
}

3. 批量处理

支持处理包含多个实体的字符串:

use htmlentity::entity::{encode, decode};

fn main() {
    let complex_text = r#"<script>alert("XSS")</script>"#;
    let encoded = encode(complex_text);
    println!("Encoded: {}", encoded);
    
    let decoded = decode(&encoded).unwrap();
    println!("Decoded: {}", decoded);
}

4. 自定义编码选项

use htmlentity::entity::{encode_with_options, EncodeSettings};

fn main() {
    let settings = EncodeSettings {
        encode_non_ascii: true,
        encode_quotes: false,
        // 其他配置选项...
    };
    
    let text = "Café & «French» quotes";
    let encoded = encode_with_options(text, &settings);
    println!("{}", encoded);
}

错误处理

use htmlentity::entity::decode;

fn main() {
    let invalid_entity = "&invalid;";
    match decode(invalid_entity) {
        Ok(decoded) => println!("Success: {}", decoded),
        Err(e) => println!("Error: {}", e),
    }
}

性能特性

  • 零分配解码(对于ASCII文本)
  • 使用查找表实现O(1)复杂度的实体解析
  • 支持no_std环境
  • 无panic设计(除了解码时的OOM情况)

使用场景

  1. Web应用安全:防止XSS攻击
  2. 文档处理:HTML/XML文档的规范化
  3. 数据清洗:处理用户输入的HTML内容
  4. 文本处理:特殊字符的转义和恢复

注意事项

  • 解码时确保处理可能的错误
  • 对于性能敏感场景,建议使用批处理API
  • 支持所有标准HTML实体,包括数字实体和命名实体

这个库为Rust开发者提供了完整、高效且安全的HTML实体处理解决方案。

完整示例demo

use htmlentity::entity::{encode, decode, encode_with_options, EncodeSettings};

fn main() {
    // 示例1: 基本编码功能
    println!("=== 基本编码示例 ===");
    let text = "Hello <World> & 'Rust'";
    let encoded = encode(text);
    println!("原始文本: {}", text);
    println!("编码后: {}", encoded);
    println!();
    
    // 示例2: 基本解码功能
    println!("=== 基本解码示例 ===");
    let html = "&lt;div&gt;Hello &amp; World&lt;/div&gt;";
    let decoded = decode(html).unwrap();
    println!("HTML实体: {}", html);
    println!("解码后: {}", decoded);
    println!();
    
    // 示例3: 批量处理示例
    println!("=== 批量处理示例 ===");
    let complex_text = r#"<script>alert("XSS")</script>"#;
    let encoded_complex = encode(complex_text);
    println!("复杂文本编码: {}", encoded_complex);
    
    let decoded_complex = decode(&encoded_complex).unwrap();
    println!("复杂文本解码: {}", decoded_complex);
    println!();
    
    // 示例4: 自定义编码选项
    println!("=== 自定义编码选项示例 ===");
    let settings = EncodeSettings {
        encode_non_ascii: true,    // 编码非ASCII字符
        encode_quotes: false,      // 不编码引号
        // 其他配置选项保持默认
    };
    
    let text_with_unicode = "Café & «French» quotes";
    let custom_encoded = encode_with_options(text_with_unicode, &settings);
    println!("自定义编码前: {}", text_with_unicode);
    println!("自定义编码后: {}", custom_encoded);
    println!();
    
    // 示例5: 错误处理
    println!("=== 错误处理示例 ===");
    let invalid_entities = vec!["&invalid;", "&#1234567;", "&"];
    
    for entity in invalid_entities {
        match decode(entity) {
            Ok(decoded) => println!("成功解码 '{}': {}", entity, decoded),
            Err(e) => println!("解码错误 '{}': {}", entity, e),
        }
    }
    
    // 示例6: 性能敏感场景的批处理
    println!("\n=== 性能敏感场景示例 ===");
    let large_text = "这是一个包含大量HTML实体的文本 &lt; &gt; &amp; &quot; &apos; &copy;";
    // 对于大量数据处理,建议使用批处理方式
    let processed = process_large_text(large_text);
    println!("处理结果: {}", processed);
}

// 批处理函数示例
fn process_large_text(text: &str) -> String {
    // 在实际应用中,这里可以进行分批处理
    let encoded = encode(text);
    decode(&encoded).unwrap_or_else(|_| "解码失败".to_string())
}

这个完整示例演示了htmlentity库的所有主要功能,包括基本编码解码、批量处理、自定义选项、错误处理以及性能优化建议。每个示例都包含详细的注释说明,帮助开发者更好地理解和使用这个库。

回到顶部