直接用 strconv.Unquote 可安全还原 strconv.Quote 生成的字符串,但要求输入严格符合 Go 字面量语法(如带引号、转义合法);它不是通用去反斜杠工具,对裸 " " 等非法格式会报错。

字符串转义后如何还原成原始内容
直接用 strconv.Unquote 就能安全还原 strconv.Quote 生成的字符串,但前提是输入格式严格符合 Go 字面量语法。它不是通用的“去反斜杠”工具,遇到 "hello
world" 这种手动拼接的含裸
的字符串会报错:invalid syntax: "hello
world" —— 因为这不是合法的 Go 字符串字面量(缺少引号、转义未被包裹)。
常见误用场景:
- 把用户输入或日志中提取的
等直接喂给Unquote,结果 panic - 用
Quote处理含 Unicode 超出 ASCII 范围的字符串(如中文),再Unquote是完全没问题的,Go 会自动转成uXXXX形式并正确还原 - 如果原始字符串本身含双引号
",Quote会自动转义为",Unquote也能识别并还原,无需额外处理
Quote 输出的格式到底长什么样
strconv.Quote 不是简单地给字符串加双引号,它会主动将所有非打印字符、控制字符、引号、反斜杠等转义为 Go 源码可读的形式。例如:
fmt.Println(strconv.Quote("a b"c\d"))
// 输出:"a b"c\d"
注意:制表符 保留为 ,双引号变成 ",反斜杠变成 \。而像 é 或 ? 这类 Unicode 字符,会按需转为 u00e9 或 U0001f680,确保输出是合法、可编译的 Go 字符串字面量。
立即学习“go语言免费学习笔记(深入)”;
关键点:
- 输出总是以双引号
"包裹(不会用反引号) - 不转义 ASCII 可见字符(字母、数字、常见符号如
-_./) - 对不可见字符优先使用简写(
),否则用u或U - 输出结果可直接粘贴进 Go 源文件作为字符串字面量使用
为什么不用 fmt.Sprintf("%q", s) 替代 Quote
fmt.Sprintf("%q", s) 行为和 strconv.Quote 高度相似,但有两处关键差异:
-
%q对 Unicode 字符一律使用uXXXX(哪怕在 BMP 平面内),而Quote在可读前提下倾向保留原字符;例如strconv.Quote("α")输出"α"(不转义),fmt.Sprintf("%q", "α")输出"u03b1" -
%q不处理字符串末尾的 NUL 字节(
