Base64是一種能將任意Binary資料用64種字元組合成字串的方法,而這個Binary資料和字串資料彼此之間是可以互相轉換的,十分方便。在實際應用上,Base64除了能將Binary資料可視化之外,也常用來表示資料加密過後的內容。然而,標準版本的Base64對於URL或是檔案路徑來說可能不是那麼的友善,因為編碼後的Base64資料可能有+或是/這兩種字元。為了解決這個問題,Base64有個變體稱作「base64url」,會將字元+對應到字元-(減號),字元/對應到字元_(底線),且用來padding的=字元通常為了節省長度而會被省略。



舉例來說,

qL8R4QIcQ/ZsRqOAbeRfcZhilN+MksRtDaErMA==

以上的這個標準版本的Base64字串,可以轉成如下的「base64url」字串:

qL8R4QIcQ_ZsRqOAbeRfcZhilN-MksRtDaErMA

轉換之後的字串可以無痛被使用在URL/URI或是檔案路徑中。

有關Base16、Base32、Base64的定義,可以查閱RFC4648。

Base64 URL

「Base64 URL」是筆者開發的套件,可以用來將任意資料編碼成base64url字串,或是將base64url字串解碼回原始資料。也可以將現有的Base64字串轉成base64url字串,或是將現有的base64url字串轉成Base64字串。

Crates.io

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

Cargo.toml

base64-url = "*"

使用方法

若要將任意資料編碼成base64url字串,可以使用encode關聯函數。

extern crate base64_url;

assert_eq!("SGVsbG8sIHdvcmxkIQ", base64_url::encode("Hello, world!"));

若要將base64url字串解碼回原始資料,可以使用decode關聯函數。

extern crate base64_url;

assert_eq!(b"Hello, world!", base64_url::decode("SGVsbG8sIHdvcmxkIQ").unwrap().as_slice());

若要將現有的Base64字串轉成base64url字串,可以使用escape關聯函數。這個函數並不會花費運算資源去檢查Base64字串的正確性。

extern crate base64_url;

assert_eq!("SGVsbG8sIHdvcmxkIQ", base64_url::escape("SGVsbG8sIHdvcmxkIQ=="));

若要將現有的base64url字串轉成Base64字串,可以使用unescape關聯函數。這個函數並不會花費運算資源去檢查base64url字串的正確性。

extern crate base64_url;

assert_eq!("SGVsbG8sIHdvcmxkIQ==", base64_url::unescape("SGVsbG8sIHdvcmxkIQ"));

另外還有其它的encode_*decode_*escape_*unescape_*關聯函數,可以用在特定的場合。例如:

extern crate base64_url;

let hash = &[1, 2, 3, 4, 5, 6, 7, 8, 9];
let url = String::from("https://example.com/?hash=");

assert_eq!("AQIDBAUGBwgJ", base64_url::encode_to_string(hash, &mut url));
assert_eq!("https://example.com/?hash=AQIDBAUGBwgJ", url);