Java 8 Base64库有两个可用于构建URI的变体:“Basic”和“URL和文件名安全”。文档指向RFC 4648表2作为差异的解释。
在阅读规范之后,我仍然不清楚两种编码之间的实际区别是什么:两种标准都得到“广泛”支持?具体的浏览器呢?是否建议对数据URI编码使用URL和文件名安全编码?是否存在已知的支持限制?
答案 0 :(得分:12)
最简单的方法是提供一个例子(恕我直言):
CITY CompLocations CompIssue
| id | | locationID | compID | | locationID | issueLevel |
|*1* | -----> | 1 | 45 | ------> | 45 | *5*
| 2 | | 2 | 203 | | 203 | 3
注意一个是 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
代表-
。
所以看来你的问题是一个安全的URI,应该在那里使用吗?;答案是肯定的。
答案 1 :(得分:0)
运行一些测试,使用base64“URL and filename safe”编码数据URI会产生Chrome无法识别的URI。
示例:data:text/plain;base64,TG9yZW0/aXBzdW0=
已正确解码为Lorem?ipsum
,而其网址安全对应data:text/plain;base64,TG9yZW0_aXBzdW0=
不是(ERR_INVALID_URL)。