Наборы символов
Процент (или URL) кодирование строки
Кодирование входной строки с помощью percent-encoding, используя utf8_percent_encode
из крейтаpercent-encoding
. Затем выполнение декодирования с помощью функции percent_decode
.
extern crate percent_encoding;
use percent_encoding::{utf8_percent_encode, percent_decode, AsciiSet, CONTROLS};
use std::str::Utf8Error;
/// https://url.spec.whatwg.org/#fragment-percent-encode-set
const FRAGMENT: &AsciiSet = &CONTROLS.add(b' ').add(b'"').add(b'<').add(b'>').add(b'`');
fn main() -> Result<(), Utf8Error> {
let input = "confident, productive systems programming";
let iter = utf8_percent_encode(input, FRAGMENT);
let encoded: String = iter.collect();
assert_eq!(encoded, "confident,%20productive%20systems%20programming");
let iter = percent_decode(encoded.as_bytes());
let decoded = iter.decode_utf8()?;
assert_eq!(decoded, "confident, productive systems programming");
Ok(())
}
Набор кодирования определяет, какие байты (в дополнение к не-ASCII и символам управления) должны кодироваться в процентах. Выбор этого набора зависит от контекста. Например, url
кодирует ?
в пути URL, но не в строке запроса.
Возвращаемое значение кодировки - это итератор срезов &str
, которые собираются в тип String
.
Кодирование строки в application/x-www-form-urlencoded
Кодирует строку в синтаксис application/x-www-form-urlencoded используя form_urlencoded::byte_serialize
, а затем декодирует её с помощью form_urlencoded::parse
. Обе функции возвращают итераторы, которые преобразуются в String
.
extern crate url; use url::form_urlencoded::{byte_serialize, parse}; fn main() { let urlencoded: String = byte_serialize("What is ❤?".as_bytes()).collect(); assert_eq!(urlencoded, "What+is+%E2%9D%A4%3F"); println!("urlencoded:'{}'", urlencoded); let decoded: String = parse(urlencoded.as_bytes()) .map(|(key, val)| [key, val].concat()) .collect(); assert_eq!(decoded, "What is ❤?"); println!("decoded:'{}'", decoded); }
Кодирование и декодирование шестнадцатеричного кода
Крейт data_encoding
предоставляет метод HEXUPPER::encode
, который принимает &[u8]
и возвращает String
содержащую шестнадцатеричное представление данных.
Аналогичным образом предоставляется метод HEXUPPER::decode
, который принимает &[u8]
и возвращает Vec<u8>
, если входные данные успешно декодированы.
Пример ниже конвертирует данные &[u8]
в шестнадцатеричный эквивалент. Сравнивает эти значение с ожидаемым значением.
extern crate data_encoding; use data_encoding::{HEXUPPER, DecodeError}; fn main() -> Result<(), DecodeError> { let original = b"The quick brown fox jumps over the lazy dog."; let expected = "54686520717569636B2062726F776E20666F78206A756D7073206F76\ 657220746865206C617A7920646F672E"; let encoded = HEXUPPER.encode(original); assert_eq!(encoded, expected); let decoded = HEXUPPER.decode(&encoded.into_bytes())?; assert_eq!(&decoded[..], &original[..]); Ok(()) }
Кодирование и декодирование base64
Кодирует байтовый срез в строку base64
с использованием функции encode
и декодирует её с помощью функции decode
.
#[macro_use] extern crate error_chain; extern crate base64; use std::str; use base64::{encode, decode}; error_chain! { foreign_links { Base64(base64::DecodeError); Utf8Error(str::Utf8Error); } } fn main() -> Result<()> { let hello = b"hello rustaceans"; let encoded = encode(hello); let decoded = decode(&encoded)?; println!("origin: {}", str::from_utf8(hello)?); println!("base64 encoded: {}", encoded); println!("back to origin: {}", str::from_utf8(&decoded)?); Ok(()) }