#codec #urlencode #decoding #escaping #character-encoding #rfc3986

no-std percent-encoding-rfc3986

RFC3986 兼容的百分比编码和解码

2 个版本

0.1.3 2021 年 11 月 18 日
0.1.2 2021 年 11 月 18 日
0.1.1 2021 年 11 月 18 日
0.1.0 2021 年 9 月 17 日

#1572 in 编码

Download history 1765/week @ 2024-04-23 917/week @ 2024-04-30 1567/week @ 2024-05-07 2146/week @ 2024-05-14 2402/week @ 2024-05-21 2133/week @ 2024-05-28 2033/week @ 2024-06-04 1948/week @ 2024-06-11 953/week @ 2024-06-18 912/week @ 2024-06-25 858/week @ 2024-07-02 1280/week @ 2024-07-09 1195/week @ 2024-07-16 993/week @ 2024-07-23 1209/week @ 2024-07-30 1245/week @ 2024-08-06

5,055 每月下载量
8 个 crate 中使用 (2 直接)

MIT/Apache

31KB
572

RFC 3968 百分比编码

关于

这是一个符合 RFC-3968 的百分比编码/解码 Rust 库。它是 percent_encoding 的分支,经过修改以支持 RFC 3986。以下为不同之处。

URI 使用特殊字符来表示请求的部分。例如,一个 ? 问号标记路径的结尾和查询字符串的开始。为了使该字符存在于路径中,需要对其进行不同的编码。

百分比编码将保留字符替换为 % 转义字符,后跟表示字节值的两个十六进制数字。例如,ASCII 空格被替换为 %20

编码时,可以(并且应该,为了可读性)留出的字符集取决于上下文。上面提到的 ? 问号在查询字符串中用作分隔符时不是分隔符,因此不需要编码。AsciiSet 参数的 percent_encodeutf8_percent_encode 让调用者进行配置。

这个 crate 故意不提供许多不同的集合。用户应考虑编码字符串将在什么上下文中使用,阅读相关规范,并定义自己的集合。这是通过使用现有集合的 add 方法来完成的。

示例

use percent_encoding_rfc3986::{utf8_percent_encode, AsciiSet, CONTROLS};
                                                                                                     
/// https://url.spec.whatwg.org/#fragment-percent-encode-set
const FRAGMENT: &AsciiSet = &CONTROLS.add(b' ').add(b'"').add(b'<').add(b'>').add(b'`');
                                                                                                     
assert_eq!(utf8_percent_encode("foo <bar>", FRAGMENT).to_string(), "foo%20%3Cbar%3E");

percent_encoding 相比有何不同?

编码差异

《percent_encoding》crate使用URL规范中的百分编码。本crate使用RFC 3986。它们之间的区别是RFC 3986要求将%字符始终进行转义,而URL规范要求将%invalid解码为%invalid - 因此,如果%符号后面不是两个十六进制数字,则忽略百分编码。

您选择哪一个完全取决于您正在解析的格式。但是,如果您还在定义格式,请考虑优先选择RFC 3986而不是URL规范。本crate的作者认为,静默忽略奇怪的字符串会导致比明确报错更多的问题。它甚至可能引起安全漏洞,这并不令人惊讶。

话虽如此,这个crate的动机实际上是解码RFC 3986编码的需求,而不是哲学上的差异。

API差异

本crate的API与percent_encoding的API非常接近。唯一的显著差异是percent_decode返回Result。本crate的目标不是尽可能接近percent_encoding,但事实证明percent_encoding有一个很好的API,至少现在没有太多理由去改变它。

本crate的Cargo功能

  • alloc - 默认开启,启用与alloc crate中的类型集成,例如Vec<u8>StringCow<'a, str>

许可证

MIT/Apache 2.0

无运行时依赖