【JS】Base64的url轉換

08 3月, 2019

【JS】Base64的url轉換





最近有需要將base64的字串放到url上當參數調用。
查了一下文檔
發現base64有定義說「不建議放到url」上。

後來實作後發現,的確放在網址上會產生出許多問題。
像是base64最後的「=」
這其實算是一個補充碼,也就是當長度沒滿足條件的時候,
會自動使用「=」填充用。

而且還有一些字符也會造成問題。
後來看了一些文章後。
大概理解,只要解決三個字符的問題即可。

並且在decode強制一定要加上urldecode
不然在url轉換或跳轉時,(譬如有透過fb做過水)
有的網站會自動encode你的參數,導致在解碼的時候有問題。




以下這種方式算是另類解法,缺點是只有自己能夠讀取
(由於轉換規則是自訂)

下面是js實現的轉換代碼:(js es6語法)



以上採用的base64庫是使用這個github上的方式 (包裝成class)
https://gist.github.com/mikedamage/73711

不使用js內建的base64加解碼,是因為為了能更好兼容各個瀏覽器。
上述類可以兼容大部分瀏覽器。(需靠插件將es6降轉版本)





後記:

在寫完2個月以後,後來去查詢RFC其實原來早就已經有定義比較安全的BASE64規範

目前有些語言已經有實作「safe base64」
上述的寫的轉換程式碼,應該還是要參照RFC的標準來定義比較好
在Safe base64定義裡,「=」還是保持著是補充碼的性質
唯一有變的是「+」變成「-」,「/」變成「_」 
效能最好的做法,就是直接去改老外寫的base64的js,替換就好。

張貼留言