printfフォーマットエスケープ
「Progress: 50% complete」は「Progress: 50%% complete」になり、printfが%を変換の始まりと誤解せずにそのまま表示します。改行、タブ、バックスラッシュは\n、\t、\\と書かれ、アンエスケープで元に戻ります。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
計算例
- テキスト
- Progress: 50% complete next step
- 計算モード
- Escape
- 結果
- Progress: 50%% complete\nnext step
- 長さ
- 34
- パーセント記号の数
- 1
- エスケープ数
- 1
printf系の書式文字列は、単独のパーセント記号を変換仕様の開始として扱うため、進捗ラベル・通貨メモ・ログテンプレートなどパーセントを含む自由文は、リテラルのパーセントをすべて%%に倍加しない限り、クラッシュ・誤解析・誤った引数消費を起こします。同時に書式本体はソースコードの文字列リテラルや設定ファイルに置かれることが多く、改行・タブ・バックスラッシュはバックスラッシュエスケープとして書く必要があります。本printfフォーマットエスケープは、各パーセントを倍加し制御文字とバックスラッシュを\\ ・\n・\r・\t・\xHHとして書き換え、元の文字が必要なときは同じ写像を逆に適用します。
printfにおけるパーセント倍加とバックスラッシュエスケープの仕組み
Cのprintf、printf風書式を受け付けるC++のiostream、Pythonの古い%書式、多くのログライブラリでは、パーセント文字が変換の開始になります。%s、%d、%.2f、%.*s、位置指定の%1$sなどはすべて単独のパーセントから始まります。
リテラルのパーセントを出力するには連続した2つ—%%—を書き、フォーマッタが1つの%を出し変換文字を探さないようにします。この規則を忘れると典型的な不具合になり、「done 50%」のようなメッセージが書式エラーになったり次の引数を奪ったりします。本機能は両層を決定的に適用します。
escapeモードでは各文字を走査し、すべての%を%%に置換し、バックスラッシュと通常の制御を最短の移植可能なエスケープにし、通常の印字可能文字はそのまま残します。
unescapeモードでは%%を1つのパーセントに戻し、対応するバックスラッシュ列を展開し、単独パーセント(実変換の開始)は混合テンプレートを復号できるようそのまま残し、末尾バックスラッシュ・不完全な\x・非16進桁・厳密読解で未定義となる未知の文字エスケープを拒否します。
送信する内容と返ってくる内容
escapeモードは平文をresultに格納されるprintf安全な書式本体へ変換します。各パーセントは倍加され、バックスラッシュは\\、制御文字は\n・\r・\t・\xHHになります。unescapeモードはその列を逆にし、復元した文字列をresultに返します。
検証失敗は前払い残高を消費しません。典型的な確認は、単独パーセントと改行を含む進捗行のエスケープ、%%と\tを使う本体のアンエスケープ、既にバックスラッシュを含む文字列の往復、裸のバックスラッシュで終わる文字列の拒否です。素早い確認や授業デモには無料のブラウザフォームを、大量フィクスチャ生成や回帰ベクトルにはスクリプトから同一契約を呼び出してください。
printfフォーマットエスケープが役立つ場面
製品名の1つのパーセントが書式を壊し、ビルド失敗や実行時クラッシュにつながります。組み込みファームウェアやデバイスドライバのチームは、すでに%%と\nを含むプロトコルダンプや操作メッセージを貼り付け、切り詰められた\xHHで静かにバイトを捏造するのではなく大声で失敗するアンエスケープ経路を必要とします。
コピー用printf例を示すドキュメントやクックブックは、利用者提供のサンプルが有効な書式本体のままになる信頼できるエスケープ経路を必要とします。サポートとセキュリティのチームは、ログのバイナリ風書式文字列をソースのフィクスチャと比較し、一般的なC文字列ツールではなくprintf風パーセント倍加に特化した1ページを望みます。
パーセント規則こそCやJavaScriptの文字列エスケープが中心に据えない検索意図だからです。printf構文を教える教材著者は、パーセント倍加を明示した例を望み、それが本ランディングが捉える検索意図です。
完全なC文字列リテラル、JavaScriptエスケープ、HTMLエンティティ、URLパーセント符号化が必要なら、別の検索意図とランディングとして扱い、本printfフォーマットエスケープのページに詰め込まないでください。
活用例
生成コード内の安全なprintf書式本体
タイトル・進捗ラベル・操作メッセージなどの自由文をprintf風書式文字列に書く前にエスケープし、リテラルのパーセントをすべて%%にします。
ログとフィクスチャから書式テンプレートを復号
%%とバックスラッシュエスケープを使うprintf風本体を可読テキストへ戻し、不完全または不正なエスケープ列では厳格に失敗します。
よくある質問
なぜprintfはパーセント記号を倍加する必要があるのですか?
単独の%は%sや%dのような変換を開始します。%%と書くとリテラルのパーセント1つを出力し、フォーマッタが引数を消費したり変換欠落で失敗したりするのを防ぎます。
エスケープとアンエスケープの両方はできますか?
はい。 modeをescape(既定)にすると平文をprintf安全な本体に符号化し、modeをunescapeにするとパーセント倍加と対応するバックスラッシュエスケープを逆にします。
アンエスケープで単独の%はどうなりますか?
そのまま残ります。本物の変換を始める記号かもしれないため、重なった%%だけを1つの%に戻します。これで、変換を含む書式もそのまま元に戻せます。
エスケープの形が壊れているとどうなりますか?
推測せず、分かりやすいメッセージで止まります。末尾のバックスラッシュ、途中で切れた\x、十六進数でない文字、未知の文字のエスケープは受け付けず、中途半端な結果は出しません。
どの文字がバックスラッシュのエスケープになりますか?
バックスラッシュは\\、改行は\n、復帰は\r、タブは\tになります。そのほかの制御文字は\xと2桁の十六進数で表し、普通に印字できる文字は変わりません。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/enc/printf-escape \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Progress: 50% complete\nnext: %s"}'const res = await fetch("https://api.kit.forhosting.com/enc/printf-escape", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "Progress: 50% complete\nnext: %s"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/enc/printf-escape",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "Progress: 50% complete\nnext: %s"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/enc/printf-escape", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"Progress: 50% complete\\nnext: %s"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"Progress: 50% complete\nnext: %s"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/enc/printf-escape", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"text": "Progress: 50% complete\nnext: %s"
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "enc.printf_escape",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
アンエスケープは%%と列挙したバックスラッシュ形式を理解し、%sや%dなど実変換を導く単独パーセントはそのまま残し、末尾のバックスラッシュ・不完全な16進エスケープ・未知のエスケープ文字では半端なゴミを作らずにinvalid_inputで即失敗します。ブラウザの無料ツールと有料APIは同一の純粋同型関数を共有するため、デモ・単体フィクスチャ・本番Webhookは常に同じ変換結果で一致します。
printfにおけるパーセント倍加とバックスラッシュエスケープの仕組み
別層として、同じ文字列をソースやJSON風設定に埋め込むと生の改行はしばしば不正または扱いにくいため、著者は改行に\n、タブに\t、1本のバックスラッシュに\\、その他の制御バイトに\xHHを書きます。経路はネットワークも乱数シードも壁時計の時刻もない純粋な文字列処理であり、同一入力は常に同一のJSONを生みます。成功したAPI呼び出しの料金は公開ベースの$0.002(1件あたり)で、検証失敗は前払い残高を消費しません。
送信する内容と返ってくる内容
必須の文字列フィールドtextと任意のmodeフィールドを送ってください。modeを省略するとescapeが既定となり、1つのペイロードでも有用な処理が行えます。応答はmodeと元のtextをエコーし、result、resultの長さ、percent_count(escapeで倍加/unescapeで解除したパーセント数。任意の\%形式を含む)、escape_count(バックスラッシュ系変換の回数)を含みます。text欠落、非文字列オブジェクト、非対応のmode、文書化された上限を超える長さ、末尾バックスラッシュ、不完全な16進エスケープ、\x後の非16進桁、未知のエスケープ文字はinvalid_inputと明確な英語メッセージで失敗します。成功時のAPI料金は公開ベースの$0.002(1件あたり)です。
printfフォーマットエスケープが役立つ場面
C・C++やprintf互換ランタイム向けにログテンプレート・翻訳カタログ・アサートメッセージを出すコード生成器は、書式文字列へ書く前に自由文フィールドをすべてエスケープしなければなりません。本機能は純粋なparseエンジンのため、API料金は成功1件あたり公開ベースの$0.002で、失敗した検証は残高を消費しません。
連携の活用例
書式文字列ユニットテスト用ゴールデンベクトル
CIでサンプルメッセージをescapeとunescapeで往復させ、パーセント倍加と制御エスケープがホストやツールチェーン間で安定するようにします。
技術的な質問
アンエスケープ時に単独の%はどうなりますか?
%sのような実変換が損なわれないようそのまま残します。%%だけが1つのパーセントに畳まれ、壊れたバックスラッシュ列は依然としてinvalid_inputで失敗します。
エスケープ列が不正な場合はどうなりますか?
Unescapeはinvalid_inputで失敗し、位置と悪い列(末尾バックスラッシュ、不完全な\xHH、未知の文字エスケープなど)を示します。検証失敗には課金されません。
料金はいくらですか?
ブラウザツールは無料でローカル実行です。API要求は成功1件あたり$0.002のKIT前払い残高を使い、無効な入力は課金されません。