Go语言中是否存在与JavaScript的unescape()功能对等的实现?
Go实现JavaScript unescape()功能的方案
Go标准库没有内置与JavaScript unescape() 完全对等的API,尤其是针对%uXXXX格式的Unicode转义序列的解码能力,需要自定义实现对应的解码逻辑。
实现逻辑说明
JavaScript的unescape()对转义序列的处理规则如下:
- 遇到
%uXXXX格式的序列:将后4位十六进制数值解析为16位Unicode码元,转为对应字符 - 遇到
%XX格式的序列:将后2位十六进制数值解析为Latin-1字符 - 其余普通字符直接保留
完整代码示例
package main import ( "errors" "fmt" "strconv" ) func Unescape(s string) (string, error) { var res []rune n := len(s) i := 0 for i < n { if s[i] == '%' { if i+1 < n && s[i+1] == 'u' { // 处理%uXXXX格式 if i+5 > n { return "", errors.New("invalid %u escape sequence") } hexStr := s[i+2 : i+6] codePoint, err := strconv.ParseUint(hexStr, 16, 16) if err != nil { return "", err } res = append(res, rune(codePoint)) i += 6 } else { // 处理%XX格式 if i+2 > n { return "", errors.New("invalid % escape sequence") } hexStr := s[i+1 : i+3] codePoint, err := strconv.ParseUint(hexStr, 16, 8) if err != nil { return "", err } res = append(res, rune(codePoint)) i += 3 } } else { res = append(res, rune(s[i])) i++ } } return string(res), nil } func main() { c, err := Unescape("%u0107") if err != nil { panic(err) } fmt.Println(c) // 输出:ć }
注意事项
如果你的使用场景只需要处理标准URI编码的内容,不需要兼容%uXXXX这种非标准的旧转义格式,可以直接使用Go标准库的url.QueryUnescape()方法,不需要自定义实现。
内容的提问来源于stack exchange,提问作者Nick D
相关产品推荐
相关产品推荐

