2 个版本
0.1.3 | 2021 年 11 月 18 日 |
---|---|
0.1.2 | 2021 年 11 月 18 日 |
0.1.1 |
|
0.1.0 |
|
#1572 in 编码
5,055 每月下载量
在 8 个 crate 中使用 (2 直接)
31KB
572 行
RFC 3968 百分比编码
关于
这是一个符合 RFC-3968 的百分比编码/解码 Rust 库。它是 percent_encoding
的分支,经过修改以支持 RFC 3986。以下为不同之处。
URI 使用特殊字符来表示请求的部分。例如,一个 ?
问号标记路径的结尾和查询字符串的开始。为了使该字符存在于路径中,需要对其进行不同的编码。
百分比编码将保留字符替换为 %
转义字符,后跟表示字节值的两个十六进制数字。例如,ASCII 空格被替换为 %20
。
编码时,可以(并且应该,为了可读性)留出的字符集取决于上下文。上面提到的 ?
问号在查询字符串中用作分隔符时不是分隔符,因此不需要编码。AsciiSet
参数的 percent_encode
和 utf8_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>
、String
和Cow<'a, str>
。
许可证
MIT/Apache 2.0