应使用 strconv.QuoteToASCII 而非 strconv.Quote 当需将含中文、emoji 等 Unicode 字符的字符串转为纯 ASCII 安全表示,如写入日志、拼接 shell 命令或生成 JSON 兼容字符串;前者将非 ASCII 字符转为 uXXXX 形式,后者保留原始 Unicode。

什么时候该用 strconv.QuoteToASCII 而不是 strconv.Quote
当你需要把含中文、emoji 或其他 Unicode 字符的字符串转成纯 ASCII 安全表示(比如写入日志、拼接 shell 命令、生成 JSON 兼容字符串但又不想用 json.Marshal),strconv.QuoteToASCII 就比 strconv.Quote 更合适——后者会保留原始 Unicode 字符,而前者强制把非 ASCII 字符转成 uXXXX 形式。
常见错误是直接用 strconv.Quote 处理用户输入后扔进 shell 或 HTTP header,结果遇到中文就出乱码或解析失败;这时候换用 QuoteToASCII 能立刻规避编码边界问题。
strconv.QuoteToASCII 的转义规则和边界行为
它会对所有非 ASCII 字符(即 rune > 127)做 u 四位十六进制转义,同时保留 ASCII 控制字符的常规转义(如
、 、\、")。注意:它不会处理 surrogate pairs(如某些 emoji 占两个 rune),遇到 UTF-16 代理对会分别转义,可能导致解码后不还原——这是 Go 1.20+ 的已知限制,不是 bug。
- 输入
"hello 世界"→ 输出"hello u4e16u754c" - 输入
"u0000ÿ"→ 输出"