本文介绍了如何在围棋中选择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编码标准?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-23 17:49