Java 8 Base64 ライブラリには、URIの構築に使用できる2つのバリアントがあります:「基本」のものと「URLおよびファイル名セーフ」です。 RFC 4648 違いの説明としての表2。
仕様を読んだ後でも、両方のエンコーディングの実際的な違いはまだはっきりしていません。どちらの規格も「広く」サポートされていますか?特にブラウザはどうですか?データURIエンコーディングには、URLとファイル名の安全なエンコーディングが推奨されますか?既知のサポート制限はありますか?
最も簡単な方法は、例(IMHO)を提供することです:
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
で、もう一方がそうでないことに注意してください。
実際、実装を見ると、エンコードに使用される2つのルックアップテーブルがあります:toBase64
とtoBase64URL
。異なるのは2つの文字だけです。
+
の/
およびtoBase64
と、-
の_
およびtoBase64URL
の比較。
だからあなたの質問1つのURIは安全であり、そこで使用する必要がありますか?;答えはイエスです。
いくつかのテストを実行し、base64の「URLとファイル名セーフ」を使用してデータURIをエンコードすると、Chromeで認識されないURIが生成されます。
例:data:text/plain;base64,TG9yZW0/aXBzdW0=
はLorem?ipsum
に正しくデコードされますが、URLセーフな対応物data:text/plain;base64,TG9yZW0_aXBzdW0=
はそうではありません(ERR_INVALID_URL)。