核心原则是别手动拼接json字符串,优先用json.stringify()自动转义;它会将双引号、反斜杠、换行符、回车符、制表符等转为标准转义序列,但u+2028/u+2029及c0控制字符需预处理。

JavaScript 中处理含特殊字符的文本内容,核心原则是:**别手动拼接 JSON 字符串,优先用 JSON.stringify() 自动转义**。它能正确处理引号、反斜杠、换行、制表符等常见特殊字符,且符合 JSON 规范。
哪些字符会被自动转义?
JSON.stringify() 会把以下字符自动转换为标准转义序列:
- 双引号
"→" - 反斜杠
→\ - 换行符
→(保留为字面量,非实际换行) - 回车符
→ - 制表符
→ - 退格
、换页同样被规范转义
注意:有些“看似普通”的字符反而危险
不是所有 Unicode 字符都安全。以下情况 JSON.stringify() 虽然能执行,但生成的字符串在后续 JSON.parse() 时可能失败:
-
U+2028(行分隔符)和 U+2029(段落分隔符):JS 字符串中合法,但 JSON 标准禁止未转义出现,直接解析会报
SyntaxError -
控制字符(U+0000–U+001F,不含
):如空字符
u0000,某些解析器会截断或报错 -
代理对边界外的码点:如
uFFFF,可能引发兼容性问题
如果文本来自用户输入、文件读取或后端响应,建议先清洗或预检这类字符。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
如何安全处理不可见控制字符?
若需确保 JSON 字符串绝对可解析,可对原始字符串做一次预处理:
function safeStringify(str) {
// 移除或替换 U+2028/U+2029 和 C0 控制字符(U+0000–U+001F,保留
)
return str.replace(/[u2028u2029u0000-u0008u000b-u000cu000e-u001f]/g, '');
}
const cleanText = safeStringify(userInput);
const json = JSON.stringify({ content: cleanText });
替代方案:不用 JSON 的深拷贝或传输
当文本只是载体,而你真正需要的是深拷贝或跨上下文传递(比如含日期、正则、Map 等),JSON.stringify() + JSON.parse() 就不合适了:
- 用
structuredClone()(现代环境):原生支持所有类型和 Unicode 字符,包括 U+2028/U+2029 - 旧环境可用
MessageChannel+postMessage,底层走结构化克隆算法 - 第三方库如
lodash.cloneDeep可处理大部分复杂类型,但默认不保留Symbol或undefined
不复杂但容易忽略——只要记住:字符串内容交给 JSON.stringify(),结构/类型需求另选方案。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










