在進行軟體開發的時候,可能會需要將使用者輸入的資料插入至網址(URL)中,但URL能夠使用的字元是有限制的,錯誤格式的URL有機會使得HTTP客戶端在訪問URL資源時出現問題,也可能會導致透過URL來傳遞的參數有誤。為了讓URL可以傳遞任意字元的資料,對於不合法的字元,我們需要將其進行編碼。例如在網址的查詢(Query)部份(?
之後的部份),如果要在查詢的參數值中使用&
字元,就不能直接使用&
字元,因為&
字元在網址查詢中是用來隔開不同的查詢參數。參數值中的&
字元,要用%26
來取代,才可以正常地把&
字元放進查詢的參數值中。
這雖然是蠻基本的功能,但是在crates.io上卻沒有好用的套件,只好自己實作一個了。
URL Escape
「URL Escape」是筆者開發的套件,可以快速地編碼(跳脫)或是解碼(反跳脫)URL的特殊字元。
Crates.io
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"));