escape vs encodeURI vs encodeURIComponent:違いを理解して使い分ける

2024-04-04

JavaScriptでクエリ文字列エンコード:escape vs encodeURI vs encodeURIComponent

各関数の概要

1 escape

  • 最も古いエンコード関数
  • すべての予約文字(RFC 2396 以外)をエスケープ
  • スペースは+ではなく%20にエンコード
  • 非推奨

2 encodeURI

  • URI全体をエンコード
  • 予約文字(RFC 3986)と一部の特殊文字をエスケープ
  • クエリ文字列を含むURL全体をエンコードする場合に有効

3 encodeURIComponent

  • クエリ文字列のみをエンコード

エンコード方法の比較

関数エンコード対象エスケープ対象スペース用途
escapeすべての文字予約文字(RFC 2396 以外)%20非推奨
encodeURIURI全体予約文字(RFC 3986)と一部の特殊文字+URL全体
encodeURIComponentクエリ文字列予約文字(RFC 3986)と一部の特殊文字+クエリ文字列のみ

使用例

const url = "https://example.com/?q=日本語";
const encodedUrl = encodeURI(url);
// 出力: https://example.com/?q=%E6%97%A5%E6%9C%AC%E8%AA%9E
const query = "q=日本語";
const encodedQuery = encodeURIComponent(query);
// 出力: q=%E6%97%A5%E6%9C%AC%E8%AA%9E

まとめ

  • escapeは非推奨なので、代わりにencodeURIまたはencodeURIComponentを使用
  • URL全体をエンコードするにはencodeURI
  • クエリ文字列のみをエンコードするにはencodeURIComponent
  • それぞれの関数の役割と用途を理解して、適切なエンコード方法を選択



escape

// 非推奨

const str = "日本語";
const escapedStr = escape(str);
console.log(escapedStr); // 出力: %E6%97%A5%E6%9C%AC%E8%AA%9E

encodeURI

const url = "https://example.com/?q=日本語";
const encodedUrl = encodeURI(url);
console.log(encodedUrl); // 出力: https://example.com/?q=%E6%97%A5%E6%9C%AC%E8%AA%9E

encodeURIComponent

const query = "q=日本語";
const encodedQuery = encodeURIComponent(query);
console.log(encodedQuery); // 出力: q=%E6%97%A5%E6%9C%AC%E8%AA%9E
  • URLパラメータを含むオブジェクトを生成
const params = {
  name: "山田太郎",
  age: 30,
};

const encodedParams = Object.keys(params)
  .map((key) => `${key}=${encodeURIComponent(params[key])}`)
  .join("&");

console.log(encodedParams); // 出力: name=%E5%B1%B1%E7%94%B0%E5%A4%AA%E9%83%8E&age=30
  • URL全体をエンコードしてGETリクエストを送信
const url = "https://example.com/api?q=" + encodeURIComponent("日本語");

const xhr = new XMLHttpRequest();
xhr.open("GET", url);
xhr.send();

これらのサンプルコードは、実際の開発でエンコード処理をどのように活用できるかを示しています。




JavaScriptでクエリ文字列をエンコードする他の方法

URLSearchParamsインターフェースを使用すると、クエリ文字列をより簡単に操作できます。

const params = new URLSearchParams();
params.append("name", "山田太郎");
params.append("age", 30);

const encodedParams = params.toString();

console.log(encodedParams); // 出力: name=%E5%B1%B1%E7%94%B0%E5%A4%AA%E9%83%8E&age=30

ライブラリ

qsなど、クエリ文字列処理に特化したライブラリを使用する方法もあります。

const qs = require("qs");

const params = {
  name: "山田太郎",
  age: 30,
};

const encodedParams = qs.stringify(params);

console.log(encodedParams); // 出力: name=%E5%B1%B1%E7%94%B0%E5%A4%AA%E9%83%8E&age=30

自作関数

上記の方法以外にも、必要な機能に特化した自作関数を作成することもできます。

function encodeQuery(obj) {
  const keys = Object.keys(obj);
  return keys.map((key) => `${key}=${encodeURIComponent(obj[key])}`).join("&");
}

const params = {
  name: "山田太郎",
  age: 30,
};

const encodedParams = encodeQuery(params);

console.log(encodedParams); // 出力: name=%E5%B1%B1%E7%94%B0%E5%A4%AA%E9%83%8E&age=30
  • シンプルなエンコード処理であれば、encodeURIComponentで十分
  • より複雑な処理や、URLSearchParamsなどの機能が必要であれば、URLSearchParamsを使用
  • ライブラリを使うことで、コードを簡潔に記述できる
  • 自作関数であれば、必要な機能に特化

それぞれの特徴を理解して、適切な方法を選択してください。

  • エンコード処理を行う前に、URLやクエリ文字列に特殊文字が含まれていないか確認する
  • エンコード処理後の文字列は、デコード処理を行わないとブラウザで正しく解釈されない

これらの点に注意して、エンコード処理を行ってください。


javascript encoding query-string


えっ、そんなに簡単だったの?JavaScriptで2つの日付間の差日数を計算する方法

DateオブジェクトのgetTimeメソッドは、日付をミリ秒単位のタイムスタンプに変換します。このタイムスタンプを利用して、2つの日付間の差日数を計算することができます。この方法のメリット:シンプルで分かりやすい多くのブラウザでサポートされている...


もう迷わない!JavaScriptでミリ秒を日付に変換する3つの方法とサンプルコード

方法1:Dateオブジェクトを使用するミリ秒を格納する変数を作成します。 const milliseconds = 1584825600000; // 2020年9月22日 00:00:00 UTC のミリ秒数Dateオブジェクトを作成します。 const date = new Date(milliseconds);...


event.clientY と event.offsetHeight プロパティを使用して子要素の dragleave イベントを処理する方法

HTML5 の dragleave イベントは、ドラッグ対象要素からマウスポインターが離れた時に発生します。しかし、子要素にホバーした時にも発生する可能性があり、意図しない動作を引き起こすことがあります。原因:これは、イベントバブリングと呼ばれるブラウザのデフォルト動作によるものです。イベントバブリングとは、子要素で発生したイベントが、親要素にも伝達される仕組みです。...


JavaScriptにおけるcurrentTargetとtargetプロパティの決定的な違い:詳細解説とサンプルコード

JavaScriptのイベントリスナーにおいて、event. target と event. currentTarget はどちらもイベント発生に関わる重要なプロパティですが、それぞれ異なる役割を果たします。混同しがちなポイントを押さえ、それぞれの特性を理解することが重要です。...


DOM API vs refs vs 状態管理ライブラリ:非制御入力変更のベストプラクティス

非制御入力を変更するには、いくつかの方法があります。DOM API を直接使用document. getElementById() などを使って DOM 要素を取得し、value プロパティを変更することで、非制御入力の値を変更できます。ref を使用して、入力要素への参照を取得し、その参照を使って値を変更できます。...


SQL SQL SQL SQL Amazon で見る



HTML属性値の囲み方:シングルクォートとダブルクォート

シングルクォートを使用できる場合属性値内にダブルクォートが含まれている場合例この例では、属性値 image. png にダブルクォートが含まれているため、シングルクォートを使用する必要があります。この例では、属性名 src にシングルクォートが含まれているため、エラーが発生します。


encodeURI()関数とencodeURIComponent()関数の違い

JavaScriptでURLエンコードを行うには、主に以下の3つの方法があります。encodeURI() 関数は、URL全体をエンコードします。URLSearchParams クラスは、URLのパラメータをエンコードする際に便利です。注意点