URLエンコード/デコードするときに記号が含まれる場合は注意が必要になります

こんにちは。堀部です。
 
URLエンコードやデコードする際に記号や半角スペースが含まれるとき、うまくデコードできなかったり半角スペースが「+」になったりしていました。いろいろ調べてみましたので、記事にまとめてみたいと思います。

URLエンコード・デコードとは

URLエンコードとはURL/URIのファイル名やクエリ文字列などの一部としては使用できない記号や文字を、使用できる文字の特殊な組み合わせによって表記する変換規則のことです。
 
%(パーセント)を付けた16進数表記されることからパーセントエンコーディングとも呼ばれます。変換される対象の文字は日本語や記号が主に該当します。
 
デコードはその逆で16進数表記から元の文字に変換することです。

JavaでURLエンコードする場合

Java標準のjava.net.URLEncoderを使用することが多いかと思います。

	String str = URLEncoder.encode(str, "UTF-8");

この時、エンコードする文字列に半角スペースが含まれていると半角スペースが「+」に変換されます。これはMIMEタイプによって定められた変換ルールのようです。
 
半角スペースを「+」ではなくそのまま半角スペースとして出力したい場合は「%20」としてエンコードする必要があります。そのため、JavaのURLエンコードで「+」に変換された後に「%20」で置換しました。
	String str = URLEncoder.encode(str, "UTF-8").replace("+", "%20");

JavaScriptでURLエンコードする場合

JavaScriptではencodeURI関数でエンコードしますが、この関数では一部の記号がエンコードされません。対象となる記号は ;,/?:@&=+$# になります。
 
これらの記号もエンコードしたい場合は、encodeURIComponent関数を使用します。ただし、-_.!~*'() これらの記号はencodeURIComponent関数でもエンコードされません。

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

<出力結果>
“;,/?:@&=+$#-_.!~*'()”
“%3B%2C%2F%3F%3A%40%26%3D%2B%24%23-_.!~*'()”

まとめ

いかがでしたでしょうか。
 
使用する言語や変換方法によってルールが異なることもあるので、違いをしっかりと認識しておくことも重要ですね。

記事をシェア
MOST VIEWED ARTICLES