编码/解码网址(Encode / decode URLs)

2019-07-04 23:01发布

什么是编码和解码围棋整个URL的推荐的方法? 我知道的方法url.QueryEscapeurl.QueryUnescape ,但他们似乎并没有被正是我期待的。 具体来说,我正在寻找像JavaScript的方法encodeURIComponentdecodeURIComponent

谢谢。

Answer 1:

你可以做你想要与所有的URL编码网/ URL模块。 它没有打出去的URL的部分的独立编码功能,你必须让它构建整个URL。 在源代码中有过一眯,我认为它确实非常好,符合标准的工作。

下面是一个例子( 操场链路 )

package main

import (
    "fmt"
    "net/url"
)

func main() {

    var Url *url.URL
    Url, err := url.Parse("http://www.example.com")
    if err != nil {
        panic("boom")
    }

    Url.Path += "/some/path/or/other_with_funny_characters?_or_not/"
    parameters := url.Values{}
    parameters.Add("hello", "42")
    parameters.Add("hello", "54")
    parameters.Add("vegetable", "potato")
    Url.RawQuery = parameters.Encode()

    fmt.Printf("Encoded URL is %q\n", Url.String())
}

它打印

Encoded URL is "http://www.example.com/some/path/or/other_with_funny_characters%3F_or_not/?vegetable=potato&hello=42&hello=54"


Answer 2:

从MDN上encodeURIComponent方法 :

encodeURIComponent方法逃避所有字符,除了以下几点:字母,十进制数字, '-', '_', '.', '!', '~', '*', ''', '(', ')'

从围棋的实现url.QueryEscape的 (具体而言, shouldEscape私有函数),脱除了以下的所有字符:字母,十进制数字, '-', '_', '.', '~'

不同于使用Javascript,Go的QueryEscape() 难逃'!', '*', ''', '(', ')' 。 基本上,Go的版本是严格RFC-3986标准。 JavaScript的是宽松的。 再从MDN:

如果希望更加严格的遵守RFC 3986(!其储备,”,(,)和*),尽管这些字符都没有正式划定URI用途,以下可以安全使用:

function fixedEncodeURIComponent (str) {
  return encodeURIComponent(str).replace(/[!'()]/g, escape).replace(/\*/g, "%2A");
}


Answer 3:

这个怎么样:

template.URLQueryEscaper(path)


Answer 4:

对于模仿JavaScript的encodeURIComponent()我创建了一个字符串辅助函数。

例如:打开"My String""My%20String"

https://github.com/mrap/stringutil/blob/master/urlencode.go

import "net/url"

// UrlEncoded encodes a string like Javascript's encodeURIComponent()
func UrlEncoded(str string) (string, error) {
    u, err := url.Parse(str)
    if err != nil {
        return "", err
    }
    return u.String(), nil
}


Answer 5:

作为围棋1.8,这种情况发生了变化。 现在,我们有机会获得PathEscape除了老QueryEscape编码路径组件,与UNESCAPE同行一起PathUnescape



Answer 6:

如果有人想要得到确切的结果比较给JS encodeURIComponent方法试试我的功能是肮脏的,但效果很好。

https://gist.github.com/czyang/7ae30f4f625fee14cfc40c143e1b78bf

// #Warning! You Should Use this Code Carefully, and As Your Own Risk.
    package main

    import (
    "fmt"
    "net/url"
    "strings"
)
/*
After hours searching, I can't find any method can get the result exact as the JS encodeURIComponent function.
In my situation I need to write a sign method which need encode the user input exact same as the JS encodeURIComponent.
This function does solved my problem.
*/
func main() {
    params := url.Values{
        "test_string": {"+!+'( )*-._~0-              
                            
标签: url escaping go