【Java】URLエンコード出来ない文字と対応方法

java

JavaでURLエンコードするには、URLEncoder.encodeを使います。
デコードの場合はURLDecoder.decodeです。
今回は、Javaでこれらのクラスを使って、URLエンコードする際の注意点をあげていきます。

[スポンサーリンク]

注意点は大きく3つあります。
1つ目は、URLエンコード出来ない文字があること。
2つ目は、半角スペースが"+"でエンコードされること。(他の言語と結果が異なります。)
3つ目は、JavaとJavascriptでURLエンコードした結果が異なること。

URLエンコード出来ない文字

JavaでURLエンコードすると、*-_の3つの記号がエンコードされません。
この3つの記号をエンコードしたい場合は、以下のように自前でreplaceする必要があります。
_(アンダースコア)は、他言語でもURLエンコードしていないので、置き換えません。

        String encodeStr = URLEncoder.encode("*-_", "UTF-8");
        encodeStr = encodeStr.replace("*", "%2a");
        encodeStr = encodeStr.replace("-", "%2d");

半角スペースが"+"でエンコードされる

エンコード対象文字列に半角スペースが入っていると、+でエンコードされます。
他の言語(JavaScriptとか)では、%20でエンコードされるので、もしあわせておきたい場合は、以下のように自前で変換処理を入れる必要があります。

        String encodeStr = URLEncoder.encode("a a", "UTF-8");
        encodeStr = encodeStr.replace("+", "%20");

JavascriptでURLエンコードした結果が異なる

エンコード出来ない文字、スペースが+になる件を見て分かる通り、JavaScriptでURLエンコードした結果とJavaでURLエンコードした結果では若干の差が生まれてきます。
JavaScript以外の他言語でURLエンコードした結果とも異なってきます。今回は多言語の代表としてJavaScriptと比較していきます。

Javaの場合

JavaでURLエンコード出来ない文字は、*-_です。
スペースは、+になります。

JavaScriptの場合

それに対して、JavaScriptでURLエンコード出来ない文字は以下の通りです。(JavaScript関数によって異なります。)
スペースは、%20になります。

encodeURI
;/?:@&=+$-_!~*.,()a#'

encodeURIComponent
-_!~*.()a'

escape
*+-_./

さいごに

URLエンコードってどの言語でも同じ結果だと思っていましたが、意外とエンコード出来る記号がバラバラでした。
規格を全ての言語で統一してくれたらプログラマとしては楽が出来ていいのですが。^^;
それでは!