You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 13:24:06