【初心者向け】JavaScriptでURLエンコードをマスターしよう!encodeURIとencodeURIComponentの使い方

2024-06-30

JavaScript におけるエンコード: encodeURI と encodeURIComponent の使い分け

JavaScript には、URL エンコードと呼ばれる処理があります。これは、特殊文字を含む文字列を、Web ブラウザやサーバーで正しく解釈できるように変換するプロセスです。主に、URL に含める文字列に対してエンコードを行います。

この処理には、主に encodeURIencodeURIComponent という2つの関数が使われます。それぞれの使い方と違いを理解することが重要です。

encodeURI は、URL 全体をエンコードするために使用されます。URL に含まれる予約文字(例:#, &, +, /, ?, :, @, =, $)を除いて、特殊文字をエスケープします。つまり、これらの予約文字はそのまま保持されます。

一方、encodeURIComponent は、URL の一部(例:クエリ文字列)をエンコードするために使用されます。encodeURI と異なり、予約文字に加えて、URL 構文の一部である文字(例:,;) もエスケープします。

使い分け

一般的に、以下の要領で使い分けることを推奨します。

  • 完全なURLをエンコードする場合: encodeURI を使用する
  • URL の一部(クエリ文字列など)をエンコードする場合: encodeURIComponent を使用する

以下の例は、それぞれの関数の動作を比較します。

const fullURL = "https://www.example.com/search?q=こんにちは";
const encodedFullURL = encodeURI(fullURL);
console.log(encodedFullURL); // 出力: https://www.example.com/search?q=%E3%81%97%E3%82%8A%E3%81%A8%E3%81%8A

const queryString = "こんにちは";
const encodedQueryString = encodeURIComponent(queryString);
console.log(encodedQueryString); // 出力: %E3%81%97%E3%82%8A%E3%81%A8%E3%81%8A

注意点

  • encodeURIencodeURIComponent は、UTF-8 エンコーディングに基づいています。
  • 誤ったエンコードを行うと、URL が正しく解析されず、エラーが発生する可能性があります。

encodeURIencodeURIComponent は、それぞれ異なる目的で使用される関数です。URL 全体と部分(クエリ文字列など)を正しくエンコードするために、それぞれの違いを理解し、適切な関数を選択することが重要です。




// URL 全体をエンコード
const fullURL = "https://www.example.com/search?q=こんにちは";
const encodedFullURL = encodeURI(fullURL);
console.log(encodedFullURL); // 出力: https://www.example.com/search?q=%E3%81%97%E3%82%8A%E3%81%A8%E3%81%8A

// URL の一部(クエリ文字列)をエンコード
const queryString = "こんにちは";
const encodedQueryString = encodeURIComponent(queryString);
console.log(encodedQueryString); // 出力: %E3%81%97%E3%82%8A%E3%81%A8%E3%81%8A

// デコード
const decodedFullURL = decodeURI(encodedFullURL);
console.log(decodedFullURL); // 出力: https://www.example.com/search?q=こんにちは

const decodedQueryString = decodeURIComponent(encodedQueryString);
console.log(decodedQueryString); // 出力: こんにちは

補足

  • 上記のコードは、Node.js やブラウザの JavaScript コンソールで実行できます。
  • decodeURIdecodeURIComponent 関数は、エンコードされた文字列を元の形式に戻すために使用します。

このサンプルコード以外にも、さまざまな状況に合わせて encodeURIencodeURIComponent を活用することができます。




JavaScript で URL をエンコードするその他の方法

ビルトインの URL クラス

近年、JavaScript には URL クラスが導入されました。このクラスを使用して、URL のエンコードとデコードをより詳細な制御で行うことができます。

const url = new URL('https://www.example.com/search?q=こんにちは');
url.searchParams.set('q', 'ハロー%20ワールド');
const encodedURL = url.toString();
console.log(encodedURL); // 出力: https://www.example.com/search?q=%E3%83%8F%E3%83%AC%E3%83%BC%20%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89

const decodedURL = new URL(encodedURL);
console.log(decodedURL.searchParams.get('q')); // 出力: ハロー ワールド

カスタムエンコード関数

特定のニーズに合わせたエンコード処理が必要な場合は、カスタムエンコード関数を作成することができます。

function encodeCustom(str) {
  const safe = str.replace(/[^A-Za-z0-9-_.~]/g, function(char) {
    return '%' + char.charCodeAt(0).toString(16).toUpperCase();
  });
  return safe;
}

const encodedString = encodeCustom('こんにちは 世界');
console.log(encodedString); // 出力: %E3%81%97%E3%82%8A%E3%81%A8%E3%81%8A%20%E4%B8%96%E7%95%8C

サードパーティライブラリ

URL エンコーディングを扱うためのサードパーティライブラリもいくつか存在します。これらのライブラリは、追加機能や使いやすさを提供する場合があります。

    それぞれの方法の比較

    方法利点欠点
    encodeURI / encodeURIComponentシンプルで使いやすい予約文字の扱いなど、詳細な制御が難しい
    URL クラス詳細な制御が可能比較的新しく、ブラウザによってはサポートされていない場合がある
    カスタムエンコード関数完全なカスタマイズが可能複雑で、エラーが発生しやすい可能性がある
    サードパーティライブラリ追加機能や使いやすさを提供ライブラリの習得が必要
    • シンプルで使いやすい方法を求める場合は、encodeURI / encodeURIComponent がおすすめです。
    • より詳細な制御が必要な場合は、URL クラスを検討しましょう。
    • 完全なカスタマイズが必要な場合は、カスタムエンコード関数を作成する必要があります。
    • 使いやすさを重視する場合は、サードパーティライブラリを活用するのも良いでしょう。

    いずれの方法を選択する場合も、出力結果を十分にテストし、期待通りにエンコードされていることを確認することが重要です。


    javascript


    【徹底解説】JavaScriptでdiv要素内のテキストを置き換えるあらゆる方法

    JavaScriptを使って、div要素内のテキストを置き換える方法はいくつかあります。ここでは、代表的な3つの方法を紹介します。innerTextプロパティを使う方法置き換えたいdiv要素を取得します。innerTextプロパティを使って、新しいテキストを設定します。...


    jQueryで要素の高さを取得する - height(), innerHeight(), outerHeight()の違い

    height() メソッド最も簡単な方法は height() メソッドを使用することです。これは、要素のコンテンツの高さ(パディングやボーダーを含む)を取得します。offset().height プロパティは、要素のコンテンツの高さ(パディング、ボーダー、マージンを含む)と、要素のスクロールバーの高さ(存在する場合)を取得します。...


    setInterval() vs setTimeout(): 5秒間隔で実行する際の比較

    setInterval() メソッドを使う解説setInterval() メソッドは、指定された間隔で関数を繰り返し実行します。第1引数には、実行する関数オブジェクトを渡します。第2引数には、実行間隔をミリ秒単位で渡します。この例では、5000ミリ秒なので5秒間隔になります。...


    Node.jsでHTTPSサーバーを構築:初心者向けチュートリアル

    まず、以下のライブラリをインストールする必要があります。node-forge: SSL/TLS証明書の生成と管理に使用します。fs: ファイルシステムへのアクセスに使用します。http2: HTTP/2プロトコルを実装するために使用します。...


    Node.jsでトランザクション、prepared statements、イベントを使用してSQLite3を操作する方法

    Node. jsでSQLite3モジュールをロードしようとすると、以下のエラーメッセージが表示されることがあります。このエラーは、いくつかの原因が考えられます。原因SQLite3モジュールがインストールされていない最も一般的な原因は、SQLite3モジュールがインストールされていないことです。以下のコマンドを実行してインストールしてください。...


    SQL SQL SQL SQL Amazon で見る



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

    1 escape最も古いエンコード関数すべての予約文字(RFC 2396 以外)をエスケープスペースは+ではなく%20にエンコード非推奨2 encodeURIURI全体をエンコード予約文字(RFC 3986)と一部の特殊文字をエスケープクエリ文字列を含むURL全体をエンコードする場合に有効