如何将\u0301等转义字符串转换为对应转义字符?求通用方案
通用处理Go中转义序列的方案
不需要手动逐个替换每种转义序列,Go标准库提供了strconv.Unquote和strconv.UnquoteChar两个工具,可以一次性处理所有合法的转义字符,包括\\b、\\t这类控制字符,以及\\uXXXX、\\UXXXXXXXX这类Unicode转义序列。
方法1:使用strconv.Unquote
这个函数要求输入字符串被双引号包裹,因此如果你的原始字符串没有双引号,需要先给它添加前后双引号,再调用函数。它会自动解析所有Go支持的转义序列。
示例代码:
package main import ( "fmt" "strconv" ) func main() { rawStr := "hello\\tworld\\u0301\\b" // 为原始字符串添加双引号,满足Unquote的格式要求 quotedStr := "\"" + rawStr + "\"" result, err := strconv.Unquote(quotedStr) if err != nil { fmt.Printf("转义处理失败: %v\n", err) return } fmt.Println(result) // 输出: hello world́ }
它能处理的转义类型包括:
- 基础控制字符:
\\b、\\t、\\n、\\r、\\f、\\v - 特殊符号转义:
\\'、\\"、\\\\ - Unicode转义:
\\uXXXX(4位十六进制)、\\UXXXXXXXX(8位十六进制) - 八进制转义:
\\XXX(3位八进制)
方法2:使用strconv.UnquoteChar(自定义处理)
如果需要更灵活的处理逻辑(比如原始字符串包含未转义的双引号,或者需要跳过某些转义序列),可以用strconv.UnquoteChar逐个字符解析转义序列。
示例代码:
package main import ( "fmt" "strconv" "strings" ) func unescape(s string) (string, error) { var buf strings.Builder i := 0 for i < len(s) { if s[i] == '\\' { // 解析转义序列,第二个参数传'"'表示遵循字符串字面量的转义规则 r, n, err := strconv.UnquoteChar(s[i:], '"') if err != nil { return "", err } buf.WriteRune(r) i += n } else { buf.WriteByte(s[i]) i++ } } return buf.String(), nil } func main() { rawStr := "hello\\tworld\\u0301\\b" result, err := unescape(rawStr) if err != nil { fmt.Printf("转义处理失败: %v\n", err) return } fmt.Println(result) // 输出: hello world́ }
注意事项
strconv.Unquote会严格校验转义序列的合法性,比如\\u123(仅3位十六进制)这种非法格式会返回错误,需要根据业务需求处理这类错误场景。- 如果原始字符串本身包含双引号,使用
Unquote前需要先将内部的双引号转义为\",否则会触发格式错误;这种场景下,使用UnquoteChar的自定义方法会更灵活。
内容的提问来源于stack exchange,提问作者WeiAnHsieh
相关产品推荐
相关产品推荐

