字符串转义 / 反转义
在线字符串转义与反转义:JSON、JavaScript、Java、C、Python、HTML、XML、CSV、SQL、正则、Shell 共 11 种格式,按各语言实际行为校验,非法转义指出具体位置。
- 在浏览器中处理
- 数据不离开你的设备
- 免费 · 无需注册
用微信扫描以下二维码即可分享
示例、说明与常见问题 带实际输出的示例、与同类工具的差别,以及常见问题。
场景一:接口返回里的 \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 / MariaDB | C:\\new\\data | 反斜杠、引号、NUL、换行、回车和 Ctrl+Z 都转义 |
无论哪种方言,状态栏都会附上 OWASP 的提醒:转义并不能可靠地防止 SQL 注入,应用代码请用参数化查询(OWASP SQL 注入防护备忘单)。
每种格式按什么规则、拿什么校验
| 格式 | 规则 | 校验方式 |
|---|---|---|
| JSON | RFC 8259 第 7 节 | 与 JSON.stringify / JSON.parse、Python json.dumps 逐条比对 |
| JavaScript | ECMAScript 字符串字面量,严格模式 | 输出放进 ""、''、模板字符串里求值 |
| Java | JLS 第 3.3、3.10.7 节 | 用 javac 21 编译运行 |
| C / C++ | C11 第 6.4.4.4 节 | 用 cc -std=c11 编译,打印字节 |
| Python | 官方文档「词法分析」的转义序列 | repr()、ascii()、ast.literal_eval |
| HTML / XML | WHATWG 字符引用 / XML 1.0 | entities 解码器、Python ElementTree |
| CSV / SQL | RFC 4180 / 引号加倍 | Python csv、sqlite3 |
| 正则 / Shell | ECMAScript 语法字符 / 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\x41 | JSON | JSON 没有 \x 转义,请改写成 \u00XX |
\u000a | Java | 在 javac 读取字符串之前就变成真正的换行,字面量无法编译 |
O'Reilly | SQL | 单个 ' 会结束 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 实体用浏览器自带的解析器解码,解码时使用的文档不能执行脚本、也不加载图片。只有所选格式、方向和选项会保存在本机。