Наборы символов

Процент (или URL) кодирование строки

![percent-encoding-badge] cat-encoding-badge

Кодирование входной строки с помощью 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

url-badge cat-encoding-badge

Кодирует строку в синтаксис 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-badge cat-encoding-badge

Крейт 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-badge cat-encoding-badge

Кодирует байтовый срез в строку 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(())
}