プラス記号が常に空白を意味するわけではありません

Moyoutil の URL ツールは URI 構成要素を変換します。decodeURIComponent によるデコードでは + がそのまま残ります。一方、URLSearchParams は application/x-www-form-urlencoded 規則を使い、元の文字列の + を空白に置き換えてからパーセントデコードします。そのため %2B で表されたプラス記号は + として残ります。

WHATWG URL: フォーム方式の解析

ECMAScript: decodeURIComponent

同じ入力を両方のパスで実行した結果

2026 年 10 月 5 日プロジェクトの urlComponent 関数と JavaScript URLSearchParams で実行した結果です。表の引用符は、空白を表示するためのJSONマークであり、結果に含まれる文字ではありません。クエリ解析では、各入力の前にq=を付けました。

コンポーネントのデコードとクエリ値解析の比較
入力Moyoutil のデコードURLSearchParams
C++"C++""C "
C%2B%2B"C++""C++"
a+b"a+b""a b"
a%20b"a b""a b"
C++ と C%2B%2B の2つのデコード経路。q=C++ をクエリとして解析すると、C の後に空白が2つ残ります。
再現したコード出力を説明する独自の図です。0x20 は空白、0x2B はプラス記号の文字コードです。画面キャプチャではありません。

クエリを保存するには、原文の値でクエリを作成します。

この例は文字列を作るだけで、サーバーへリクエストを送りません。元の値 C++ guide を URLSearchParams に渡すと、プラス記号は %2B、空白は + になります。encodeURIComponent で値を変換すると空白は %20 になります。この例では、どちらもクエリとして解析すれば元の値を取り出せます。

const original = "C++ guide";
const query = new URLSearchParams({ q: original }).toString();
// q=C%2B%2B+guide
const component = encodeURIComponent(original);
// C%2B%2B%20guide
new URLSearchParams(query).get("q");
// C++ guide

WHATWG URL: URLSearchParams シリアライズ

現在の Moyoutil URL ツールには、クエリ名と値を組み立てる入力欄やフォーム形式のデコードモードはありません。値を確認するには C++ guide をエンコードし、結果をデコードして元の文字列と比べます。値の変換欄に URL 全体を入れないでください。実際の API では指定されたエンコード規則を確認してください。

すでにエンコードされた値を入れると、パーセント記号も変換されます

URLSearchParams のオブジェクト形式には、エンコードしていない元の値を渡します。encodeURIComponent で変換済みの値を渡すと、% が %25 に再エンコードされます。下のクエリを1回解析した結果は C++ ではなく C%2B%2B です。繰り返しデコードする前に、送信側と受信側の処理を確認してください。

const encoded = encodeURIComponent("C++");
// C%2B%2B
const query = new URLSearchParams({ q: encoded }).toString();
// q=C%252B%252B
new URLSearchParams(query).get("q");
// C%2B%2B

問題のあるリンクを調べる順序

  1. 元のクエリと渡されたクエリ文字列を一緒に保持します。 C++ と C%2B%2B を区別します。
  2. 受信コードが decodeURIComponent であるかフォーム形式のクエリパーサーであるかを確認します。 Moyoutilのデコード結果だけでサーバーの結果を決定することはありません。
  3. 原文の値でクエリを再設定し、解析結果と比較します。サンプルコードと実際のAPIのルールを区別します。

%または%2のように不完全なパーセント表記はMoyoutilのエラーです。 %FFも有効なUTF-8テキストではないため、エラーです。このチェックは、他のパーサのエラー処理まで同じという意味ではなく、原文を自動回復する機能でもありません。

よくある質問

%20 と + のどちらを使えばよいですか?

1つの値をMoyoutilでエンコードすると、スペースは%20です。 URLSearchParams 直列化では + です。受信側のルールを確認し、原文で往復するかどうかを確認してください。

元のプラス記号をすべて空白に変更できますか?

いいえ。C++ のような値の意味が変わります。フォーム形式で受け取った文字列にだけその解析規則を適用し、エンコード前の原文を勝手に変えないでください。