在理清字符集和字符編碼關係一文中我們介紹了常見字符集以及字符編碼之間的關係,本期我們繼續朝著這個方向介紹常見的編碼算法。
URL編碼
URL編碼是瀏覽器發送數據給服務器時使用的編碼,它是編碼算法,而不是加密算法,URL編碼的目的是把任意文本數據編碼為以%前綴表示的文本,編碼後的文本僅包含A~Z,a~z,0~9以及-_.*,這樣做便於瀏覽器和服務器處理,比如,
Java代碼如下:
String origin = URL;String encoded = URLEncoder.encode(origin, "UTF-8");System.out.println(encoded);String ori = new String(URLDecoder.decode(encoded, "UTF-8"));System.out.println(ori);
Base64編碼
我們知道電子郵件協議是文本協議,如果我們要在電子郵件中添加二進制文件,此時就可以通過Base64編碼將二進制文件轉換成文本,否則就會出現亂碼現象。
Base64編碼是一種將二進制數據用文本表示的編碼算法,它只包含64個字符,如下所示:
['A', 'B', 'C', ... 'a', 'b', 'c', ... '0', '1', ... '+', '/']
對應的索引分別從0到63。由於Base64只能展示64種文本字符,因此對於二進制數據,它就需要一套映射機制來實現將二進制數據轉換成文本數據,即選取3個字節為一組,進行重新分組:每6個bit為一個新的字節,形成4組,如果要編碼的二進制數據不是3的倍數,最後會剩下1個或2個字節怎麼辦?Base64用\\x00字節在末尾補足後,再在編碼的末尾加上1個或2個=號,表示補了多少字節,解碼的時候,會自動去掉。
由於將原先的3個字節變成4個字節,也就是說長度增加了33%,因此,傳輸效率降低了,目前我們通過將Base64應用於傳輸少量二進制數據的常見中,例如Cookie、URL等。
Java代碼如下:
String origin = "編碼測試!";String encoded = java.util.Base64.getEncoder().encodeToString(origin.getBytes());System.out.println(encoded);
輸出結果是57yW56CB5rWL6K+VIQ==,末尾有兩個=說明補充了2個\\x00字節。
寫在最後
閱讀更多 末路狂奔在路上 的文章