文字列エスケープ / アンエスケープ

JSON・JavaScript・Java・C・Python・HTML・XML・CSV・SQL・正規表現・シェルの文字列をエスケープ/アンエスケープ。各言語の実際の挙動で検証し、不正なエスケープは位置を表示。

  • ブラウザ内で処理
  • データはブラウザ外に出ません
  • 無料 · 登録不要
どの言語の文字列規則で処理するかを決めます。表示されるオプションは形式と方向で変わります。JavaScript と Python は引用符と非 ASCII の扱い、JSON は \uXXXX 出力、Java と C は非 ASCII の扱い、HTML は文字参照、XML は属性値、CSV は区切り・引用符・数式対策、SQL は方言です。正規表現とシェルにオプションはなく、ほとんどのオプションはエスケープ方向だけに出ます。形式を切り替えても入力は残り、変換し直します。形式・方向・オプションはこの端末に保存し、入力したテキストは保存しません。
「エスケープ」はテキストを、選んだ形式の文字列リテラルの中身に変換します。「アンエスケープ」はそのリテラルをテキストに戻します。切り替えても入力欄の内容は残り、変換し直します。「入れ替え」は結果を入力欄に移してから方向を切り替えます。
オフ:出力は JSON.stringify と同じで、非 ASCII 文字はそのままです。オン:U+007E より後の文字をすべて \uXXXX にし、U+FFFF を超える文字はサロゲートペアで書きます。Python の json.dumps の既定の出力と同じです。 「\uXXXX」は非 ASCII 文字をすべて \uXXXX にし、U+FFFF を超える文字はサロゲートペアで書きます。「\u{…}」は U+FFFF を超える文字を 1 つの \u{…} で書きます。「そのまま」は見える文字を残しますが、ゼロ幅スペース、バイト順マーク、U+0020 以外の空白など見えない文字はエスケープします。U+2028 と U+2029 はどの設定でもエスケープします。 「UTF-8 バイト」は非 ASCII 文字を UTF-8 のバイト列にし、1 バイトを 3 桁の 8 進エスケープで書きます。「\u / \U」はユニバーサル文字名で書きます。「そのまま」は見える文字を残し、見えない文字はユニバーサル文字名にします。どの設定でも U+0080〜U+009F はバイトで書き、?? の 2 つ目の ? は \? にしてトライグラフにならないようにします。 値が = + - @(全角を含む)、タブ、改行のいずれかで始まるときに働きます。「なし」は値を変えず、ステータス行に警告だけ出します。「' を付ける」は値の前にアポストロフィを付け、フィールドを引用符で囲みます。「タブを付ける(Excel)」は引用符の中で値の前にタブを付け、そのタブはデータに残ります。 「標準」は一重引用符を 2 つ重ね、バックスラッシュは変えません。テキストにバックスラッシュか U+0000 があるとステータス行で知らせます。「MySQL / MariaDB」は一重引用符、二重引用符、バックスラッシュ、NUL、改行、復帰、Ctrl+Z をバックスラッシュのエスケープで書きます。アンエスケープも同じ方言で読み、前後の一重引用符はあってもなくても構いません。

結果は入力と同時に更新されます。「例」は選んだ形式のサンプルを入れます。アンエスケープでは、リテラルの前後の引用符はあってもなくても構いません。入力全体が引用符付きのリテラル 1 つなら、引用符を外してステータス行に表示します。JSON・Java・C は二重引用符、JavaScript は一重・二重引用符とバッククォート、Python は一重・二重引用符、SQL は一重引用符が対象です。バックスラッシュの代わりに ¥ や ₩ で書いたものはエスケープにならず、ステータス行がその文字を示します。
この欄は読み取り専用です。「コピー」で内容をコピーし、「入れ替え」で入力欄に移して方向を反転します。入力が選んだ形式として正しくないときは空になり、ステータス行が原因と位置を示します。位置と文字数は Unicode コードポイントで数えるので、😀 は 1 文字です。入力に改行があるときは行と列で示します。
例・詳しい説明・よくある質問 実際の出力つきの例、ほかのツールとの違い、よくある質問。

Java の \uXXXX と .properties

Java のプロパティファイルは長く ISO-8859-1 が前提で、日本語のメッセージは native2ascii で \uXXXX に変換して書くのが定番でした。Java 9 で ResourceBundle が UTF-8 のプロパティファイルを読めるようになり(JEP 226)、native2ascii ツール自体も JDK 9 で削除されています(Oracle:JDK 9 で削除された機能)。それでも既存プロジェクトには \uXXXX の値が残っています。読むときは Java → アンエスケープ:

入力:msg.notfound=\u30d5\u30a1\u30a4\u30eb\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093
出力:msg.notfound=ファイルが見つかりません

逆向きは Java → エスケープ(非 ASCII:\uXXXX)で ファイルが見つかりません が上の \u30d5…\u3093 になります。

注意点が 2 つあります。Java のソースコードでは \uXXXX が文字列を読む前に置き換えられるため、改行を \u000a と書くとコンパイルエラーになります(JLS 3.10.5)。ツールはエスケープ時に必ず \n を使い、アンエスケープで \u000a を見つけると理由を示してエラーにします。もう 1 つ、この形式は Java の文字列リテラルの規則に従うので、.properties 特有の \: や \= は「Java のエスケープシーケンスではない」と表示されます。

¥ と \ の取り違え

日本語版 Windows のコードページでは 0x5C の位置が円記号で、フォントもバックスラッシュを ¥ で表示します。Microsoft のドキュメントは、Unicode から日本語コードページに変換するとき U+005C と U+00A5 がどちらも同じ 0x5C になると説明しています(Character Sets Used in File Names)。画面の C:¥new¥data を見て打ち直すと、本物の円記号 U+00A5 が入ることがあります。

このテキストを JSON → アンエスケープ に入れても ¥n は改行になりません。U+00A5 はエスケープ文字ではないからです。ツールはテキストを変えずに残し、「¥n の先頭は ¥(U+00A5)で、バックスラッシュではない」と注記します。全角の \(U+FF3C)や ¥(U+FFE5)も同じように検出します。

CSV と全角の =

表計算ソフトは =、+、-、@ で始まるセルを数式として扱います。OWASP の CSV インジェクションのページは、日本語環境などでは全角の = + - @ も数式として解釈されうると明記しています。ツールは全角も検出します:

入力数式対策出力
=1+1なし=1+1(数式として実行されうると注記)
=1+1' を付ける"'=1+1"

' を付ける方法は OWASP のサニタイズ手順そのものですが、OWASP は Excel で保存して開き直すと ' が消えることがあると注意しています。Excel で見る前提なら「タブを付ける」を選ぶと、OWASP が示すタブ前置になります(タブはデータに残ります)。

各形式の規則と検証方法

形式規則検証
JSONRFC 8259 第 7 節JSON.stringify / JSON.parse、Python json.dumps
JavaScriptECMAScript の文字列リテラル(strict モード)""・''・テンプレートリテラルとして評価
JavaJLS 3.3・3.10.7javac 21 でコンパイルして出力
C / C++C11 6.4.4.4cc -std=c11 でコンパイルしてバイト列を出力
Python言語リファレンス「字句解析」repr()、ascii()、ast.literal_eval
HTML / XMLWHATWG の文字参照 / XML 1.0entities のデコーダー、Python ElementTree
CSV / SQLRFC 4180 / 引用符の二重化Python csv、sqlite3
正規表現 / シェルECMAScript の構文文字 / POSIX のクォートRegExp(フラグなし・u・v)と Python re、shlex.quote と /bin/sh

検証スクリプトはリポジトリの scripts/test-string-escape.mjs です。

エラー表示の例

入力形式表示
it\'sJSON\'(3 文字目):JSON に \' はありません。’ はそのまま書きます。
a\01bJavaScript古い 8 進エスケープで strict モードでは SyntaxError。\x01 と書いてください
\u000aJavajavac が文字列を読む前に本物の改行になり、コンパイルできません

SQL 形式では、OWASP の「エスケープは SQL インジェクションを確実には防げない」という注意を毎回表示します(OWASP SQL Injection Prevention Cheat Sheet)。

ほかのツールとの比較

2026-10-01 にデスクトップ版 Chromium で、Bing の「エスケープ 変換」上位のツールを同じ入力で試しました。

  • codertools.net:JavaScript のエスケープで NUL の後ろに 1 が続くと a\01(古い 8 進表記)を出力します。\x4、\u{1F600}、JSON の \q はエラーにならずそのまま返ります。CSV の =1+1 には何の注意も出ません。
  • devlab.itlibra.com:「HTML entities (all non-ASCII)」で 😀 を �� と、UTF-16 の半分ずつの参照 2 つにします。ブラウザはこれを置換文字 2 つとして表示します。JSON の不正なエスケープは「Invalid JSON string escapes」と出ますが、位置は示しません。

このツールは同じ入力に対して \x001、😀、位置付きのエラーを返し、テキストを外部に送りません。

関連ツール

エスケープの前に文字列に見えない文字が混ざっていないか調べるなら見えない文字検出ツール、パーセントエンコードは URL エンコード / デコード、実体参照の一覧は HTML エンティティ エンコーダー / デコーダー、エスケープした正規表現の確認は正規表現テスターが使えます。

制限事項

  • 入力は 1 つの文字列値として扱います。CSV のアンエスケープは 1 フィールド、シェルのアンエスケープは引数 1 つだけを読みます。
  • Python の \N{名前} は Unicode の文字名表が必要なため対応していません(エラーで \u / \U を案内します)。
  • HTML のエスケープは本文と引用符付きの属性値が対象です。<script> 内の JavaScript、CSS、URL はそれぞれの規則が必要です。
  • 正規表現のエスケープは文字クラス [...] の外で使う前提です。Python の verbose モード(re.X)では空白と # も構文になります。
  • XML 1.0 で使えない文字(ほとんどの C0 制御文字、U+FFFE、U+FFFF、対になっていないサロゲート)はエスケープできず、エラーになります。

FAQ

\u30a8\u30e9\u30fc のような文字列を日本語に戻すには?

形式を JSON か Java にしてアンエスケープを選び、貼り付けます。Java の .properties を native2ascii で変換した値や、Python の json.dumps(既定で ensure_ascii=True)の出力はこの形です。逆に Java で「非 ASCII:\uXXXX」を選ぶと、日本語を \uXXXX に変換できます。

¥n が改行にならないのはなぜですか?

日本語 Windows のフォントはバックスラッシュ(U+005C)を ¥ で表示します。画面を見て打ち直すと本物の円記号 U+00A5 が入ることがあり、これはエスケープ文字ではありません。ツールはテキストをそのまま残し、どの文字が原因かを注記で示します。

アンエスケープで「エスケープされていない " で文字列が終わってしまいます」と出ます

アンエスケープには文字列リテラルの中身を入れます。そこでは " はすべて \" と書かれているはずです。すでに元に戻った JSON({"a":1} など)を貼ると、最初の引用符が指摘されます。入力全体が引用符付きのリテラル("a\nb" など)なら、前後の引用符は自動で外して注記します。

SQL 形式でエスケープすれば SQL インジェクションを防げますか?

防げません。' を '' にすれば正しい文字列リテラルにはなりますが、OWASP はエスケープを「強く非推奨」としています。結果がデータベースや設定、文字コードに左右されるためです。アプリケーションではプレースホルダ(パラメータ化クエリ)を使ってください。SQL 形式は手書きのスクリプトやテストデータ向けです。

入力したテキストはサーバーに送られますか?

送られません。11 形式すべてブラウザ内で計算します。HTML の文字参照はブラウザ自身のパーサーで復元しますが、そのときに使う文書はスクリプトを実行せず、画像も読み込みません。この端末に保存するのは選んだ形式・方向・オプションだけです。