Java 8中基本和url base64编码之间的差异
Java8库有两个可用于URI构建的变体:“基本”变体和“URL和文件名安全”变体。文件中提到表2作为差异的解释Java 8中基本和url base64编码之间的差异,java,java-8,base64,uri,Java,Java 8,Base64,Uri,Java8库有两个可用于URI构建的变体:“基本”变体和“URL和文件名安全”变体。文件中提到表2作为差异的解释 在阅读了规范之后,我仍然不清楚这两种编码之间的实际区别是什么:这两种标准都“广泛”支持吗?具体来说浏览器呢?对于数据URI编码,是否建议使用URL和文件名安全编码?是否存在已知的支持限制?最简单的方法是提供一个示例(IMHO): 请注意,一个是URL安全的,另一个不是 事实上,如果您查看实现,有两个用于编码的查找表:toBase64和toBase64URL。只有两个字符不同: +和/
在阅读了规范之后,我仍然不清楚这两种编码之间的实际区别是什么:这两种标准都“广泛”支持吗?具体来说浏览器呢?对于数据URI编码,是否建议使用URL和文件名安全编码?是否存在已知的支持限制?最简单的方法是提供一个示例(IMHO): 请注意,一个是
URL安全的
,另一个不是
事实上,如果您查看实现,有两个用于编码的查找表:toBase64
和toBase64URL
。只有两个字符不同:
+
和/
适用于toBase64
而-
和适用于toBase64URL
因此,您的问题似乎是一个安全的URI,应该在那里使用?;答案是肯定的 运行一些测试,使用base64“URL和文件名安全”编码数据URI,会产生Chrome无法识别的URI
示例:数据:文本/普通;base64,TG9yZW0/aXBzdW0=
正确解码为Lorem?ipsum
,而其URL安全对应物数据:text/plain;base64,TG9yZW0\u aXBzdW0=
不是(ERR\u INVALID\u URL)。那么假设主要浏览器实现URL安全标准?例如,MDN文档没有指定这一点。@vinntec我真的不能说。。。但从实现来看,我会这么认为。实际上,当放入数据URI时,Chrome无法解释URL安全的,但可以解释基本的。@Eugene这是否意味着我可以使用Base64编码器进行编码,然后用-和/和替换+然后字符串将与Base64 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));