最简单的方法是提供一个例子(我个人认为):
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安全
的,而另一个则不是。
事实上,如果您查看实现,会发现有两个查找表用于编码: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)。
data:text/plain;base64url,........
会怎样呢?虽然我以前从未尝试过,但这似乎是合理的,因为您提供的字符串是base64url
编码的,但您告诉Chrome它是base64
。 - Rafid Muhymin Wafi