如何对 URL 的主机部分进行解码?

huangapple go评论88阅读模式
英文:

How can I unescape a url's host?

问题

我有以下要处理的URL:

http://shitenonions%2elibsyn%2ecom/rss

当我尝试在Go中创建一个URL时,出现了以下错误:

panic: parse http://shitenonions%2elibsyn%2ecom/rss: hexadecimal escape in host

我该如何修复这个URL,以便可以正确解析?我有一组大量的URL,其中几个URL都有这个问题。

我考虑过对URL进行解码,但我担心如果这样做,除了主机名之外的部分可能会解码错误。

英文:

I have the following URL I'm trying to process:

http://shitenonions%2elibsyn%2ecom/rss

When I try to create a url out of it in Go, I get the following error:

panic: parse http://shitenonions%2elibsyn%2ecom/rss: hexadecimal escape in host

How can I fix this URL so it can be parsed correctly? I have a large set of URLs and several of them have this problem.

I thought about URL decoding it, but I'm worried that if I do that, it might be incorrect to url decode items besides the host name.

答案1

得分: 2

你可以使用url.QueryUnescape函数将实体%hh解码为字符:

package main

import (
  "fmt"
  "net/url"
  "strings"
)

func fixHost(link string) string {
  if strings.HasPrefix(link, "http://") {
    p := strings.Index(link[7:], "/")
    if -1 != p {
      host, _ := url.QueryUnescape(link[7:7+p])
      return "http://" + host + link[7+p:]
    }
  }
  return link
}

func main() {
  fmt.Println(fixHost("http://shitenonions%2elibsyn%2ecom/rss"))
}

这段代码使用了url.QueryUnescape函数来将实体%hh解码为字符。在fixHost函数中,如果链接以http://开头,它会找到第一个斜杠的位置,并使用url.QueryUnescape解码主机部分。然后,它将解码后的主机部分与原始链接的剩余部分拼接起来,并返回修复后的链接。在main函数中,我们调用fixHost函数并打印结果。

英文:

You can use url.QueryUnescape to decode entities %hh back to the characters:

package main

import (
  "fmt"
  "net/url"
  "strings"
)

func fixHost(link string) string {
  if strings.HasPrefix(link, "http://") {
    p := strings.Index(link[7:], "/")
    if -1 != p {
      host, _ := url.QueryUnescape(link[7:7+p])
      return "http://" + host + link[7+p:]
    }
  }
  return link
}

func main() {
  fmt.Println(fixHost("http://shitenonions%2elibsyn%2ecom/rss"))
}

huangapple
  • 本文由 发表于 2015年8月15日 07:31:44
  • 转载请务必保留本文链接:https://go.coder-hub.com/32020033.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定