编码/解码 URL

新手上路,请多包涵

在 Go 中编码和解码整个 URL 的推荐方法是什么?我知道方法 url.QueryEscapeurl.QueryUnescape ,但它们似乎并不是我正在寻找的。具体来说,我正在寻找像 JavaScript 的 encodeURIComponentdecodeURIComponent 这样的方法。

原文由 Sergi Mansilla 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

您可以使用 net/url 模块进行所有您想要的 URL 编码。它不会为 URL 的各个部分分解单独的编码函数,您必须让它构造整个 URL。在仔细研究了源代码后,我认为它做得非常好并且符合标准。

这是一个例子( 游乐场链接

 package main

import (
    "fmt"
    "net/url"
)

func main() {

    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"

原文由 Nick Craig-Wood 发布,翻译遵循 CC BY-SA 4.0 许可协议

来自 MDN 上的 encodeURIComponent

encodeURIComponent 转义除以下字符以外的所有字符:字母、十进制数字、 '-', '_', '.', '!', '~', '*', ''', '(', ')'

Go 的 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");
}

原文由 mna 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏