encoding - Rust 如何使用字节参数对字符串进行 urlencode?

标签 encoding rust

我有一些这样的参数:

{'peer_id': '-PC0001-781232119400', 'port': 6889, 'event': 'started', 'compact': 1, 'left': 2097152000, 'uploaded': 0, 'info_hash': b'\xd5@\xfcH\xeb\x12\xf2\x831c\xee\xd6B\x1dD\x9d\xd8\xf1\xce\x1f', 'downloaded': 0}

我想把它全部编码成一个字符串,如下所示:

my_url?peer_id=-PC0001-781232119400&port=6889&event=started&compact=1&left=1&uploaded=0&info_hash=%D5%40%FCH%EB%12%F2%831c%EE%D6B%1DD%9D%D8%F1%CE%1F&downloaded=0"

我玩过 urlcode 并想出了这个:

extern crate url;
use url::form_urlencoded;

fn main() {

    let encoded: String = form_urlencoded::Serializer::new(String::new())
        .append_pair("foo", "bar & baz")
        .append_pair("saison", "Été+hiver")
        .finish();

    println!("{:?}", encoded);
}

问题是,apprend_pair 包含一对 &'str - 它不包含字节...我不确定如何实现我的目标.

在 python 中,我只使用内置的 from urllib.parse import urlencode 并执行 urlencode(params)

最佳答案

这有点 hack,但您可以通过闭包覆盖值的编码方式,因此,您将能够以这种方式潜入二进制值。在下面的示例中,我使用 "!" 指示替换二进制值的位置,但您实际上可以使用任何东西:

fn main() {
    let binary = vec![0, 1, 2, 3];

    let encoded = form_urlencoded::Serializer::new(String::new())
        .append_pair("foo", "bar & baz")
        .append_pair("saison", "Été+hiver")
        .encoding_override(Some(&|input| {
            if input != "!" {
                // Return the actual value ("info_hash", in this particular case)
                Cow::Borrowed(input.as_bytes())
            } else {
                // When "!" is seen, return the binary data instead
                Cow::Owned(binary.clone())
            }
        }))
        .append_pair("info_hash", "!")
        .finish();

    println!("{:?}", encoded);
}

这输出

"foo=bar+%26+baz&saison=%C3%89t%C3%A9%2Bhiver&info_hash=%00%01%02%03"

您可以在这里试用:https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=805d80ebbc98909fa32177030102ba12

关于encoding - Rust 如何使用字节参数对字符串进行 urlencode?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58026024/

相关文章:

javascript - 重音字符的问题

rust - 等效于 abi.encodePacked

filter - 为什么我的迭代器过滤器中针对泛型类型的比较操作不起作用?

rust - 不能使用 format_args!由于临时值在该语句结束时被释放

python - 使用 python 清理凌乱的 CSV,保存在 Excel 中

php - mb_convert_encoding 问题

url - 使用带有编码 URL 的 CURL 进行删除

perl - 如何让 Perl 尊重 STDIN/STDOUT/STDERR 的区域设置编码,而不影响文件 IO?

rust - 我如何在 Rust 中获取 SHA256 的前 4 个字节?

rust - 用特征别名替换特征绑定(bind)说 "the size for values cannot be known at compilation time"