【发布时间】:2017-03-29 09:27:39
【问题描述】:
Java 8 Base64 库有两种可用于 URI 构建的变体:“基本”一种和“URL 和文件名安全”。文档指向 RFC 4648 表 2 作为对差异的解释。
阅读规范后,我仍然不清楚这两种编码之间的实际区别是什么:两种标准都“广泛”支持吗?具体来说浏览器呢?是否建议将 URL 和文件名安全编码用于数据 URI 编码?是否存在已知的支持限制?
【问题讨论】:
Java 8 Base64 库有两种可用于 URI 构建的变体:“基本”一种和“URL 和文件名安全”。文档指向 RFC 4648 表 2 作为对差异的解释。
阅读规范后,我仍然不清楚这两种编码之间的实际区别是什么:两种标准都“广泛”支持吗?具体来说浏览器呢?是否建议将 URL 和文件名安全编码用于数据 URI 编码?是否存在已知的支持限制?
【问题讨论】:
最简单的方法是提供一个例子(恕我直言):
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)。
【讨论】: