JavaScriptエンコーディング関数使い分け
JavaScriptにおけるescape、encodeURI、encodeURIComponentの使い分け
escape、encodeURI、encodeURIComponentは、JavaScriptでURLエンコードを行うための関数です。しかし、それぞれの用途が異なるため、使い間違えると意図しない結果が生じます。
escape
- 注意点
いくつかの文字(+、.、@、*、_)はエスケープされません。また、一部のブラウザではサポートされていない場合があります。 - 特徴
すべての非ASCII文字をエスケープシーケンス(%xx)に変換します。 - 用途
古くからある関数で、主にURLエンコード用でしたが、現在はあまり使用されません。
encodeURI
- 例
encodeURI("http://example.com/?q=こんにちは")
- 特徴
URLで許容される文字(/、?、#、&、=)を除いて、すべての非ASCII文字をエスケープシーケンスに変換します。 - 用途
URL全体のエンコードに使用します。
encodeURIComponent
- 例
encodeURIComponent("こんにちは")
- 用途
URLのクエリ文字列やパス部分をエンコードに使用します。
使い分けのポイント
- 古いコードとの互換性が必要な場合
escape
を使用できますが、新しいコードでは避けるべきです。 - クエリ文字列やパス部分をエンコードする
encodeURIComponent
を使用します。 - URL全体をエンコードする
encodeURI
を使用します。
例
const url = "http://example.com/?q=こんにちは";
// URL全体をエンコード
const encodedUrl = encodeURI(url); // http://example.com/?q=%E3%81%93%E3%82%93%E3%82%8B%E3%81%8B
// クエリ文字列をエンコード
const encodedQuery = encodeURIComponent("こんにちは"); // %E3%81%93%E3%82%93%E3%82%8B%E3%81%8B
const newUrl = "http://example.com/?q=" + encodedQuery;
JavaScriptのエンコーディング関数(escape, encodeURI, encodeURIComponent)の使い分けとコード例
なぜ使い分ける必要があるのか?
JavaScriptでURLを扱う際、escape
、encodeURI
、encodeURIComponent
の3つのエンコーディング関数がよく使われます。しかし、これらはそれぞれエンコードする対象や方法が異なるため、使い間違えると意図しない結果になることがあります。
各関数の特徴と使い分け
- encodeURIComponent
- URLの一部(クエリパラメータなど)をエンコードする際に使用します。
- URLで特別な意味を持つ文字も含めて全ての非ASCII文字をエスケープします。
- 使用例
let query = "こんにちは 世界"; let encodedQuery = encodeURIComponent(query); // %E3%81%93%E3%82%93%E3%81%8B%E3%81%8C%E4%B8%96%E7%95%8C let url = "http://example.com/search?q=" + encodedQuery;
- encodeURI
- URL全体をエンコードする際に使用します。
- URLで特別な意味を持つ文字(/、?、#、&、=など)はエスケープしません。
- 使用例
let url = "http://example.com/search?q=JavaScript"; let encodedUrl = encodeURI(url); // http://example.com/search?q=JavaScript
- escape
- 古い関数で、現在はあまり推奨されません。
- 全ての非ASCII文字をエスケープしますが、一部の文字はエスケープされなかったり、ブラウザによって挙動が異なったりする可能性があります。
- 使用例
let str = "こんにちは世界"; let encodedStr = escape(str); // %u3053%u3093%E3%81%93%E3%81%8C%E4%B8%96%E7%95%8C
いつどの関数を使うべきか?
- 古いコードとの互換性を保ちたい時
escape
(ただし、新しいコードでは避けるべき) - URLの一部(クエリパラメータなど)をエンコードする時
encodeURIComponent
- どの関数を使うかは、エンコードする対象と、その後の処理によって決まります。
encodeURI
はURL全体をエンコードし、encodeURIComponent
はURLの一部をエンコードします。escape
は古い関数で、新しいコードではencodeURI
かencodeURIComponent
を使うべきです。
具体的な使用例
// フォームの入力値をURLのクエリパラメータとして送信する例
function submitForm() {
let searchKeyword = document.getElementById("searchKeyword").value;
let encodedKeyword = encodeURIComponent(searchKeyword);
let url = "http://example.com/search?q=" + encodedKeyword;
window.location.href = url;
}
注意点
- 特に、クエリパラメータに特殊文字が含まれる場合は、必ず
encodeURIComponent
を使ってエンコードする必要があります。 encodeURI
とencodeURIComponent
は、エンコードする対象によって使い分ける必要があります。escape
はブラウザによって挙動が異なる可能性があるため、使用は避けるべきです。
- Node.jsでは、
querystring
モジュールを使ってクエリ文字列を解析したり、生成したりすることができます。 URLSearchParams
オブジェクトを使うと、より安全かつ簡単にURLのパラメータを操作できます。
JavaScriptのエンコーディング関数以外の代替方法
URLSearchParams オブジェクト
- 使用例
const params = new URLSearchParams(); params.append('search', 'こんにちは 世界'); const url = 'http://example.com?' + params.toString(); console.log(url); // http://example.com/?search=%E3%81%93%E3%82%93%E3%81%8B%E3%81%8C%E4%B8%96%E7%95%8C
- メリット
- 自動的にエンコード/デコードを行うため、手動でのエンコード処理が不要になります。
- モダンなJavaScriptで推奨される方法です。
- 特徴
URLの検索パラメータを扱うためのオブジェクトです。
fetch API
- 使用例
fetch('http://example.com/search?q=こんにちは%20世界') .then(response => response.json()) .then(data => console.log(data));
- メリット
Request
オブジェクトのurl
プロパティに直接URLを渡すことができるため、手動でのエンコードが不要な場合があります。
- 特徴
Web APIで、ネットワークリクエストを行うためのインターフェースです。
ライブラリ/フレームワークの利用
- 使用例
(Axiosの例)axios.get('http://example.com/search', { params: { q: 'こんにちは 世界' } }) .then(response => { console.log(response.data); });
- メリット
- 自動的にエンコード処理を行ってくれる場合が多いです。
- より複雑なHTTPリクエストを簡単に扱うことができます。
- 特徴
Axios, jQueryなど、多くのライブラリ/フレームワークがHTTPリクエストを簡略化する機能を提供しています。
どの方法を選ぶべきか?
- ライブラリ/フレームワーク
プロジェクトで既に使用しているライブラリ/フレームワークがあれば、それらの機能を活用するのが効率的です。 - fetch API
より高度なネットワークリクエストを行う場合に適しています。 - 単純なURLエンコード
URLSearchParams
が最も簡単で安全です。
- プロジェクトの規模や複雑さ、チームのスキルレベルに合わせて、最適な方法を選択しましょう。
URLSearchParams
、fetch API
、ライブラリ/フレームワークを利用することで、より安全かつ簡単にURLエンコードを行うことができます。escape
、encodeURI
、encodeURIComponent
は、手動でエンコードを行う必要があるため、誤った使用に注意が必要です。
- 必要に応じて、それぞれのドキュメントを参照してください。
- 上記の方法でも、特殊な文字やUTF-8以外の文字エンコーディングを使用する場合には、注意が必要です。
javascript encoding query-string