在進行軟體開發的時候,可能會需要將使用者輸入的資料插入至網址(URL)中,但URL能夠使用的字元是有限制的,錯誤格式的URL有機會使得HTTP客戶端在訪問URL資源時出現問題,也可能會導致透過URL來傳遞的參數有誤。為了讓URL可以傳遞任意字元的資料,對於不合法的字元,我們需要將其進行編碼。例如在網址的查詢(Query)部份(?之後的部份),如果要在查詢的參數值中使用&字元,就不能直接使用&字元,因為&字元在網址查詢中是用來隔開不同的查詢參數。參數值中的&字元,要用%26來取代,才可以正常地把&字元放進查詢的參數值中。



這雖然是蠻基本的功能,但是在crates.io上卻沒有好用的套件,只好自己實作一個了。

URL Escape

「URL Escape」是筆者開發的套件,可以快速地編碼(跳脫)或是解碼(反跳脫)URL的特殊字元。

Crates.io

https://crates.io/crates/url-escape

Cargo.toml

url-escape = "*"

使用方法

編碼

url_escape這個crate提供了一些encode_函數,可以針對不同的使用情境編碼URL文字。

例如,要在URL的錨點(fragment),也就是#之後的部份加入文字的話,可以使用encode_fragment函數來跳脫文字中的 "<>`字元。

assert_eq!("a%20%3E%20b?", url_escape::encode_fragment("a > b?"));

_to_writer_to_vec_to_string為名稱後綴的函數可以方便用來產生URL。

let mut url = String::from("https://");
assert_eq!("admin%40example.com", url_escape::encode_userinfo_to_string("admin@example.com", &mut url));
url.push_str("@127.0.0.1/");
assert_eq!("%E4%B8%AD%E6%96%87%E5%AD%97/eng/12%2034", url_escape::encode_path_to_string("中文字/eng/12 34", &mut url));
url.push('/');
assert_eq!(r"56%2F78", url_escape::encode_component_to_string("56/78", &mut url));
url.push('?');
assert_eq!(r"a=1&b=a%20b%20c", url_escape::encode_query_to_string("a=1&b=a b c", &mut url));

assert_eq!("https://admin%40example.com@127.0.0.1/%E4%B8%AD%E6%96%87%E5%AD%97/eng/12%2034/56%2F78?a=1&b=a%20b%20c", url);
解碼
assert_eq!("中文字/eng/12 34", url_escape::decode("%E4%B8%AD%E6%96%87%E5%AD%97/eng/12%2034"));