2017-03-29 81 views
1

Java 8 Base64庫有兩種可用於URI構建的變體:「基本」和「URL和文件名安全」。該文件指出RFC 4648表2作爲差異的解釋。Java 8中基本和url base64編碼之間的差異

閱讀規範後,我仍不清楚這兩種編碼之間的實際區別:這兩種標準是否被「廣泛」支持?關於瀏覽器具體如何?推薦用於數據URI編碼的URL和文件名安全編碼?是否有已知的支持限制?

回答

4

最簡單的方法是提供一個例子(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而另一個不是。

事實上,如果你看看實現,有兩個用於編碼的查找表:toBase64toBase64URL。只有兩個人物,對他們有所不同:

+/toBase64-_toBase64URL

所以看起來你的問題是一個安全的URI,應該在那裏使用?;答案是肯定的。

+0

那麼,假設主要瀏覽器實現了URL安全標準?例如MDN文檔沒有說明這一點。 – vinntec

+1

@vinntec我真的不能說......但我會假設如此看待實施。 – Eugene

+0

事實上,Chrome在放入數據URI時無法解釋URL安全URL,但可以解釋基本URL。 – vinntec

0

運行一些測試,使用base64「URL和文件名安全」編碼數據URI會產生Chrome無法識別的URI。

示例:data:text/plain;base64,TG9yZW0/aXBzdW0=已正確解碼爲Lorem?ipsum,而其URL安全對應data:text/plain;base64,TG9yZW0_aXBzdW0=不是(ERR_INVALID_URL)。