URLエンコード・デコード
このツールは通常のUnicodeテキストをRFC 3986準拠のパーセント符号へ変換し、正しい符号から読みやすいテキストを復元します。URLの部品として安全に渡す場合はエンコードを、ログ、リダイレクト、クエリ、コピーしたリンクを読む場合はデコードをお選びください。処理は決定的で状態を保持せず、不正なシーケンスを曖昧な結果に置き換えずエラーとして通知します。ブラウザーで直接実行でき、APIでも1項目あたり$0.002で同じ処理をご利用いただけます。
無料で実行
パーセント符号化が必要になる場面
URLでは、スラッシュはパス区切り、疑問符はクエリ開始、アンパサンドはパラメーター区切り、等号は名前と値の区切り、ハッシュはフラグメント開始という役割を持ちます。これらがデータそのものに含まれる場合、URL構造と混同されないようにする必要があります。本機能は入力をUTF-8へ変換し、RFC 3986の非予約文字以外の各バイトを、パーセント記号と2桁の16進数で表します。英数字、ハイフン、ピリオド、アンダースコア、チルダはそのまま残ります。空白はプラス記号ではなく<code>%20</code>になります。入力は完成済みURLではなく1つの値として扱うため、予約記号も符号化します。組み立て済みURL全体ではなく、挿入する部品だけをエンコードしてください。
厳密なデコードでデータを守る仕組み
値を返す前に入力全体を検査します。各パーセント記号の直後には16進数が2桁必要なため、<code>%</code>、<code>%2</code>、<code>%GG</code>は入力エラーになります。さらに、符号化されたバイト列は正しいUTF-8でなければなりません。見た目が正しい並びでも壊れたテキストの場合があり、置換文字で受け入れるとログやコールバック、取込データの破損を隠してしまいます。そのため明示的にエラーを返します。プラス記号を空白へ変換するHTMLフォーム方式は適用しません。また処理は1回だけです。<code>%2520</code>は空白ではなく<code>%20</code>になります。二重デコードを防ぐため、2回目が必要な場合は結果を明示的に再送してください。
結果を安全に利用する方法
モードを明確に選び、1つの論理値を表す文字列だけをご指定ください。エンコード結果へ別のURLエンコーダーを適用すると、各パーセント記号が<code>%25</code>となり二重符号化されます。デコード結果はデータとして扱い、信頼済みのマークアップ、ファイルパス、命令として使用しないでください。文字の復元は、次の利用先に対する安全性を保証しません。この区別はコールバック、ログ、リンク正規化、識別子の比較で重要です。ネットワーク、乱数、時計、保存状態を使わないため、同じ入力から常に同じ出力が得られます。単独の値の確認にはブラウザーを、自動テストや処理にはAPIをご利用ください。APIは1項目あたり$0.002です。
活用例
クエリ値の準備
空白、アンパサンド、Unicode、予約記号を1つの値に保つため、入力テキストを符号化します。
符号化ログの確認
取得したパスやパラメーターを復元し、元の内容を読みながら壊れたエスケープを検出します。
連携動作のテスト
安定したテストデータを作り、コールバックや処理がRFC 3986を1層だけ復元することを確認します。
よくある質問
APIリクエストの料金はいくらですか?
APIは1項目あたり$0.002です。ページでは対話形式でも実行できます。
スラッシュや疑問符は残りますか?
残りません。入力を1つの値として扱うため、予約記号もパーセント符号化します。
空白はプラス記号になりますか?
なりません。RFC 3986では空白を%20と表します。プラス記号の規則はHTMLフォーム方式です。
不正なパーセント表記はどうなりますか?
不足した表記、16進数でない表記、正しいUTF-8にならないバイト列は入力エラーになります。
複数回デコードされますか?
されません。各リクエストは1回だけ処理します。2層目が意図された場合に限り、結果を再送してください。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/web/url-encode-decode \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"hello world/café?x=1","mode":"encode"}'const res = await fetch("https://api.kit.forhosting.com/web/url-encode-decode", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "hello world/café?x=1",
"mode": "encode"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/web/url-encode-decode",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "hello world/café?x=1",
"mode": "encode"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/web/url-encode-decode", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"hello world/café?x=1","mode":"encode"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"hello world/café?x=1","mode":"encode"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/web/url-encode-decode", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"text": "hello world/café?x=1",
"mode": "encode"
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.url_encode_decode",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
timeout_sec | 30 |
max_crawl_pages | 25 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |