JavaScript encodeURIComponentとencodeURIの違い

目次

encodeURIComponentとencodeURIの違いのまとめ

役割 エンコードしない文字 用途
encodeURIComponent URLの一部分(クエリパラメータ値) をエンコードするのに適している ほぼ全ての記号をエンコードする(?, &, =, # などもエンコード対象)

name=valueのvalue 部分など、パラメータ値だけを安全にエンコードしたいとき

encodeURI URL全体をエンコードするのに適している :, /, ?, #, &, =, + などURLの構文で使う記号はエンコードしない

http://example.com/path?name=value など、構造を壊さず全体をエンコードしたいとき

URLをエンコードする理由

URLは基本的にASCII文字(英数字・一部記号)で表現され、日本語や空白、特殊記号(&, =, ?, # など)はそのままURLに入れると解釈できません。

そのためエンコードを行います。

encodeURIComponentとは

URLの構文で使用する記号も変換します。

<script>
let url = "https://example.com/search?arg1=test1&2&arg2=test3";
console.log(encodeURIComponent(url));
// https%3A%2F%2Fexample.com%2Fsearch%3Farg1%3Dtest1%262%26arg2%3Dtest3

// クエリパラメータだけの例
let base = "https://example.com/search?";
let keyword1 = "test1&2";
let keyword2 =  "test3";
console.log(base + "arg1=" + encodeURIComponent(keyword1) + "&arg2=" +encodeURIComponent(keyword2));
// https://example.com/search?arg1=test1%262&arg2=test3
</script>

4行目は、コロン(:)、スラッシュ(/)、 クエスチョンマーク(?)、イコール(=)は、アンパサンド(&)は変換されています。

8,9行目は、URLのパラメータ値を変数にセットしています。
10行目は、パラメータ値のみ変換されています。

→イコール(=)、アンパサンド(&)を変換するのでパラメータ値の変換に向いています。

encodeURIとは

URLの構文で使用する記号は変換しません。

<script>
let url = "https://example.com/search?arg1=test1&2&arg2=test3";
console.log(encodeURI(url));
// https://example.com/search?arg1=test1&2&arg2=test3
</script>

コロン(:)、スラッシュ(/)、 クエスチョンマーク(?)、イコール(=)、アンパサンド(&)は、変換されていません。

→イコール(=)、アンパサンド(&)が変換されていないのでパラメータの変換に向いていません。
理由:ユーザ入力に含まれていると区切りと誤解されてしまうため。

arg1のパラメータ値はtest1%2ですが、&がそのまま表示されてしまっています。

関連の記事

JavaScript URIエンコード(encodeURIComponent)

△上に戻る