本文介绍了如何在围棋中选择URL编码标准?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个Go客户端,它正在与遵循RFC 1738URL编码规则的服务器通信。此后,RFC 1738已被RFC 3986更新(取代),GO似乎正在使用RFC 3986,至少在1.17.7版中是这样。s := "blue+~light blue"
s = url.QueryEscape(s)
fmt.Println(s) // blue%2B~light+blue
在RFC 1738中,~
是保留的(&2-0)字符,应编码为%7E
,而在RFC 3986中不需要编码~
。这只是两个RFC之间的一个区别,可能还有其他我还没有研究过的,这就是为什么用%7E
替换~
的天真方法不是我想要走的路。是否可以让Go创建与RFC 1738兼容的编码URL(&Q;)?如果没有,是否有第三方库可以这样做,也许是通过接受RFC编号参数?time
已经这样做了:t.Format(time.RFC822)
t.Format(time.RFC850)
t.Format(time.RFC1123)
t.Format(time.RFC3339)
推荐答案
Go不为url.QueryEscape提供任何旋钮。为您的方案创建自定义转义程序非常容易。
首先声明一个应保留在结果中的字节表:
// noEscape[b] is true if b is in the intersection of the allowed
// bytes in RFC 1738 and HTML5 form values. Note that RFC 1738
// removes one byte allowed by HTML 5 -- '~'.
var noEscape = [256]bool{
'A': true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true,
'a': true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true,
'0': true, true, true, true, true, true, true, true, true, true,
'-': true,
'_': true,
'.': true,
}
下面是函数:
// queryEscape1738 escapes the string so it can be safely
// placed inside a query.
func queryEscape1738(s string) string {
percent := 0 // number of bytes to % encode
plus := false // do we need to + encode space?
for i := 0; i < len(s); i++ {
b := s[i]
if b == ' ' {
plus = true
} else if !noEscape[b] {
percent++
}
}
// Nothing to do?
if percent == 0 && !plus {
return s
}
// Encode!
p := make([]byte, 0, len(s)+2*percent)
for i := 0; i < len(s); i++ {
b := s[i]
if b == ' ' {
p = append(p, '+')
} else if noEscape[b] {
p = append(p, b)
} else {
p = append(p, '%', "0123456789ABCDEF"[b>>4], "0123456789ABCDEF"[b&15])
}
}
return string(p)
}
话虽如此,服务器不太可能关心~
是否编码。典型的解码器将+
转换为空格,%xx
转换为解码的十六进制值,所有其他字节值均按原样使用。
这篇关于如何在围棋中选择URL编码标准?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!