Java 8 Base64庫有兩種可用於URI構建的變體:「基本」和「URL和文件名安全」。該文件指出RFC 4648表2作爲差異的解釋。Java 8中基本和url base64編碼之間的差異
閱讀規範後,我仍不清楚這兩種編碼之間的實際區別:這兩種標準是否被「廣泛」支持?關於瀏覽器具體如何?推薦用於數據URI編碼的URL和文件名安全編碼?是否有已知的支持限制?
Java 8 Base64庫有兩種可用於URI構建的變體:「基本」和「URL和文件名安全」。該文件指出RFC 4648表2作爲差異的解釋。Java 8中基本和url base64編碼之間的差異
閱讀規範後,我仍不清楚這兩種編碼之間的實際區別:這兩種標準是否被「廣泛」支持?關於瀏覽器具體如何?推薦用於數據URI編碼的URL和文件名安全編碼?是否有已知的支持限制?
最簡單的方法是提供一個例子(IMHO):
Base64.Encoder enc = Base64.getEncoder();
Base64.Encoder encURL = Base64.getUrlEncoder();
byte[] bytes = enc.encode("subjects?_d".getBytes());
byte[] bytesURL = encURL.encode("subjects?_d".getBytes());
System.out.println(new String(bytes)); // c3ViamVjdHM/X2Q= notice the "/"
System.out.println(new String(bytesURL)); // c3ViamVjdHM_X2Q= notice the "_"
Base64.Decoder dec = Base64.getDecoder();
Base64.Decoder decURL = Base64.getUrlDecoder();
byte[] decodedURL = decURL.decode(bytesURL);
byte[] decoded = dec.decode(bytes);
System.out.println(new String(decodedURL));
System.out.println(new String(decoded));
通知如何一個是URL safe
而另一個不是。
事實上,如果你看看實現,有兩個用於編碼的查找表:toBase64
和toBase64URL
。只有兩個人物,對他們有所不同:
+
和/
爲toBase64
與-
和_
爲toBase64URL
。
所以看起來你的問題是一個安全的URI,應該在那裏使用?;答案是肯定的。
運行一些測試,使用base64「URL和文件名安全」編碼數據URI會產生Chrome無法識別的URI。
示例:data:text/plain;base64,TG9yZW0/aXBzdW0=
已正確解碼爲Lorem?ipsum
,而其URL安全對應data:text/plain;base64,TG9yZW0_aXBzdW0=
不是(ERR_INVALID_URL)。
那麼,假設主要瀏覽器實現了URL安全標準?例如MDN文檔沒有說明這一點。 – vinntec
@vinntec我真的不能說......但我會假設如此看待實施。 – Eugene
事實上,Chrome在放入數據URI時無法解釋URL安全URL,但可以解釋基本URL。 – vinntec