字符串转义 / 反转义

在线字符串转义与反转义:JSON、JavaScript、Java、C、Python、HTML、XML、CSV、SQL、正则、Shell 共 11 种格式,按各语言实际行为校验,非法转义指出具体位置。

  • 在浏览器中处理
  • 数据不离开你的设备
  • 免费 · 无需注册
决定按哪种语言的字符串规则处理。显示的选项随格式和方向变化:JavaScript 与 Python 的引号和非 ASCII 字符处理、JSON 的 \uXXXX 输出、Java 与 C 的非 ASCII 字符处理、HTML 的字符引用、XML 的属性值、CSV 的分隔符、加引号和公式防护、SQL 的方言。正则表达式和 Shell 没有选项,多数选项只在转义方向出现。切换格式会保留输入并重新转换。格式、方向和选项保存在本机,输入的文本不保存。
「转义」把原文变成所选格式的字符串字面量内容,「反转义」把这样的字面量读回原文。切换方向会保留输入框里的内容并重新转换。「互换」先把结果放进输入框,再切换方向。
不勾选:输出与 JSON.stringify 相同,非 ASCII 字符保持原样。勾选:U+007E 之后的字符都写成 \uXXXX,超过 U+FFFF 的字符写成一对代理项,与 Python json.dumps 的默认输出一致。 「\uXXXX」把所有非 ASCII 字符写成 \uXXXX,超过 U+FFFF 的写成一对代理项。「\u{…}」把超过 U+FFFF 的字符写成一个 \u{…}。「保留原字符」不动可见字符,但零宽空格、字节顺序标记、U+0020 以外的空格等不可见字符仍会转义。U+2028 和 U+2029 在任何设置下都转义。 「UTF-8 字节」把每个非 ASCII 字符按 UTF-8 字节输出,每个字节写成三位八进制转义。「\u / \U」写成通用字符名。「保留原字符」不动可见字符,不可见字符仍写成通用字符名。任何设置下,U+0080 到 U+009F 都按字节输出,连续两个问号的第二个写成 \?,避免形成三字符组。 值以 = + - @(含全角写法)、制表符或换行开头时生效。「关闭」不改动值,只在状态栏给出警告。「前加 '」在值前加一个撇号并给字段加引号。「前加 Tab(Excel)」在引号内的值前加一个制表符,这个制表符会留在数据里。 「标准」把每个单引号写成两个,反斜杠不动;文本含反斜杠或 U+0000 时状态栏会提醒。「MySQL / MariaDB」把单引号、双引号、反斜杠、NUL、换行、回车和 Ctrl+Z 写成反斜杠转义。反转义按同一方言读取,带不带两端的单引号都可以。

结果随输入实时更新。「示例」填入当前格式的样例。反转义时,字面量带不带两端的引号都可以:整段输入是一个带引号的字面量时,会去掉引号并在状态栏说明。JSON、Java、C 认双引号,JavaScript 认单引号、双引号和反引号,Python 认单引号和双引号,SQL 认单引号。用 ¥ 或 ₩ 代替反斜杠写的不算转义,状态栏会指出这个字符。
这个框只读。「复制」复制其中的内容,「互换」把它放进输入框并切换方向。输入不符合所选格式时,这里会清空,状态栏指出问题和位置。位置和字符数都按 Unicode 码点计,😀 算 1 个;输入有换行时改为给出行号和列号。
示例、说明与常见问题 带实际输出的示例、与同类工具的差别,以及常见问题。

场景一:接口返回里的 \u4e2d\u6587

PHP 的 json_encode 默认把多字节字符写成 \uXXXX,要原样输出得加 JSON_UNESCAPED_UNICODE(PHP 手册);Python 的 json.dumps 默认 ensure_ascii=True,json.dumps({'name': '张三'}) 得到 {"name": "\u5f20\u4e09"}。日志里再套一层字符串时,引号也被转义了。把这样的一段放进 JSON → 反转义:

输入:{\"name\":\"\u5f20\u4e09\",\"city\":\"\u4e0a\u6d77\"}
输出:{"name":"张三","city":"上海"}

反方向也一样:勾选「非 ASCII 字符写成 \uXXXX」后,{"name":"张三"} 转义为 {\"name\":\"\u5f20\u4e09\"},与 Python json.dumps 默认输出的写法一致(工具的测试脚本会逐条比对)。不勾选时,输出与浏览器的 JSON.stringify 完全相同,中文原样保留。

场景二:写进 MySQL 的 Windows 路径

把 C:\new\data 拼进一条 SQL 字符串时,标准 SQL 不用动反斜杠,但 MySQL 默认会把 \n 读成换行(MySQL 8.4 手册 表 11.1)。两种方言的输出:

方言输出说明
标准(PostgreSQL、SQLite、SQL Server、Oracle)C:\new\data只把 ' 写成 '';状态栏提示:MySQL 会把 \ 当转义符
MySQL / MariaDBC:\\new\\data反斜杠、引号、NUL、换行、回车和 Ctrl+Z 都转义

无论哪种方言,状态栏都会附上 OWASP 的提醒:转义并不能可靠地防止 SQL 注入,应用代码请用参数化查询(OWASP SQL 注入防护备忘单)。

每种格式按什么规则、拿什么校验

格式规则校验方式
JSONRFC 8259 第 7 节与 JSON.stringify / JSON.parse、Python json.dumps 逐条比对
JavaScriptECMAScript 字符串字面量,严格模式输出放进 ""、''、模板字符串里求值
JavaJLS 第 3.3、3.10.7 节用 javac 21 编译运行
C / C++C11 第 6.4.4.4 节用 cc -std=c11 编译,打印字节
Python官方文档「词法分析」的转义序列repr()、ascii()、ast.literal_eval
HTML / XMLWHATWG 字符引用 / XML 1.0entities 解码器、Python ElementTree
CSV / SQLRFC 4180 / 引号加倍Python csv、sqlite3
正则 / ShellECMAScript 语法字符 / POSIX 引用RegExp(无标志、u、v)与 Python re;shlex.quote 与 /bin/sh

测试脚本是仓库里的 scripts/test-string-escape.mjs。几个容易写错的细节:JavaScript 里 NUL 后面跟数字时必须写 \x00,写成 \0 再接 1 就成了旧式八进制 \01,严格模式下报错;Java 里换行只能写 \n,\u000a 会在 javac 读字符串之前变成真正的换行(JLS 3.10.5);HTML 里 😀 要写成一个引用 😀,拆成两个 UTF-16 代理项的引用会被浏览器解成两个替换字符。

报错与提示

输入不符合所选格式时,工具不猜,直接指出问题和位置:

输入格式提示
path\x41JSONJSON 没有 \x 转义,请改写成 \u00XX
\u000aJava在 javac 读取字符串之前就变成真正的换行,字面量无法编译
O'ReillySQL单个 ' 会结束 SQL 字符串,请写成 ''

提示不影响结果:CSV 值以 =、+、-、@、制表符或换行开头时,表格软件可能把它当公式执行(OWASP CSV 注入),「公式防护」提供 OWASP 给出的两种写法——加引号并在前面加 ',或在引号内前面加一个 Tab(OWASP 称后者在 Excel 里更可靠)。

与其他在线工具的对比

2026-10-01 在桌面 Chromium 中用同样的输入测试了 cn.bing.com「字符串转义 在线」排在前面的两款工具:

  • 在线工具大全(lddgo.net):每次转换都把文本发到 openapi.lddgo.net;JSON 反转义把 a\qb 变成 aqb、把 \x4 变成 x4,不给任何提示;\u{1F600} 返回「server internal error」;JSON 转义时 U+0000 原样留在结果里,而 RFC 8259 要求控制字符必须转义。
  • codertools.net:JavaScript 转义把 NUL 后接 1 写成旧式八进制 a\01;\x4、\u{1F600} 和 JSON 里的 \q 原样返回,不报错;SQL 转义不处理反斜杠,没有 MySQL 选项。

本工具对同样的输入分别给出带位置的报错、\x001 和 \u0000,全程不联网。

相关工具

想先看清字符串里有没有零宽字符,可以用零宽字符检测器;URL 百分号编码用 URL 编码 / 解码;完整的实体对照表在 HTML 实体编码 / 解码;转义好的正则可以放进正则表达式测试器里试。

限制

  • 输入按一个字符串值处理。CSV 反转义只读一个字段,不读整份文件;Shell 反转义只读一个参数,遇到未加引号的空白就停止。
  • Python 的 \N{名称} 需要 Unicode 字符名称表,工具没有内置,会报错提示改用 \u 或 \U。
  • HTML 转义适用于正文和带引号的属性值;<script> 里的 JavaScript、CSS、URL 各有自己的编码规则。
  • 正则转义用于字符类 [...] 之外;Python 的 verbose 模式(re.X)还会把空格和 # 当语法。
  • XML 1.0 禁止的字符(多数 C0 控制字符、U+FFFE、U+FFFF、落单的代理项)无法转义,会直接报出。

FAQ

接口返回的中文变成了 \u4e2d\u6587,怎么还原?

选 JSON 格式、反转义,把这段文字粘进去即可。PHP 的 json_encode 默认把非 ASCII 字符写成 \uXXXX,Python 的 json.dumps 默认 ensure_ascii=True 也是这样;它们本身是合法 JSON,解析后就是中文。反过来,勾选「非 ASCII 字符写成 \uXXXX」,输出与 Python json.dumps 的默认结果一致。

为什么反转义提示「未转义的 " 会提前结束字符串」?

反转义要的是字符串字面量里面的内容,那里每个双引号都写成 \"。如果粘贴的是已经还原好的 JSON,比如 {"a":1},第一个引号就会被指出,因为已经没有可反转义的内容了。如果整段输入是一个带引号的字面量(例如 "a\nb"),工具会自动去掉两端引号并在状态栏说明。

SQL 格式转义后能防 SQL 注入吗?

不能。把单引号写成两个只能得到合法的字符串字面量,OWASP 把「转义所有用户输入」列为强烈不建议的做法,因为结果取决于数据库、配置和字符集。应用代码里请用参数化查询(预编译语句)。SQL 格式适合手写一次性脚本、测试数据和迁移文件。

MySQL 和其他数据库的转义为什么不一样?

标准 SQL 只把 ' 写成 '',反斜杠是普通字符;PostgreSQL(默认 standard_conforming_strings = on)、SQLite、SQL Server、Oracle 都这样。MySQL 和 MariaDB 默认把反斜杠当转义符(除非开启 NO_BACKSLASH_ESCAPES),所以 C:\new 在 MySQL 里会变成 C: 加一个换行。选「MySQL / MariaDB」方言会把反斜杠也转义。

输入的内容会上传吗?

不会。11 种格式都在浏览器里计算。HTML 实体用浏览器自带的解析器解码,解码时使用的文档不能执行脚本、也不加载图片。只有所选格式、方向和选项会保存在本机。