Java 8中basic和url base64编码之间的区别

Java 8 Base64库有两个可用于构建URI的变体:“Basic”和“URL和文件名安全”。 文档指向RFC 4648表2作为差异的解释。

在阅读规范之后,我仍然不清楚两种编码之间的实际区别是什么:两种标准都得到“广泛”支持? 具体的浏览器呢? 是否建议对数据URI编码使用URL和文件名安全编码? 是否存在已知的支持限制?

最简单的方法是提供一个例子(恕我直言):

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,应该在那里使用? ; 答案是肯定的。

运行一些测试,使用base64“URL和文件名安全”编码数据URI会产生Chrome无法识别的URI。

示例: data:text/plain;base64,TG9yZW0/aXBzdW0=正确解码为Lorem?ipsum ,而其URL安全对应data:text/plain;base64,TG9yZW0_aXBzdW0=不是(ERR_INVALID_URL)。