如何使用Go检索网页并将其转换为UTF-8

时间:2018-07-04 13:49:39

标签: go utf-8

我需要下载一些大的html文件(约300k +)。一切工作正常,问题在于某些文件带有Windows-1252 / ISO-8859字符,例如“á”或“ç”,当我保存文档时,Go将其转换为�等字符。有想法吗?

我的代码如下:

package main

import (
  "io"
  "net/http"
  "os"
)

func main() {

  pagina := "http://www.mypage.com/doc?someparameters=123"
  err := DownloadFile("doc.html", pagina)
  if err != nil {
    panic(err)
  }

}

func DownloadFile(filepath string, url string) error {
  out, err := os.Create(filepath)
  if err != nil {
    return err
  }
  defer out.Close()

  resp, err := http.Get(url)
  if err != nil {
    return err
  }
  defer resp.Body.Close()

  _, err = io.Copy(out, resp.Body)
  if err != nil {
    return err
  }

  return nil
}

1 个答案:

答案 0 :(得分:1)

类似的东西:

import "golang.org/x/text/encoding/charmap"

rdrBody := charmap.Windows1252.NewDecoder().Reader(resp.Body)
_, err = io.Copy(out, rdrBody)

rdrBody := charmap.ISO8859_1.NewDecoder().Reader(resp.Body)
_, err = io.Copy(out, rdrBody)

软件包ISO8859中还有许多其他charmap编码。


使用charmap.ISO8859_1包的简单示例:

package main

import (
    "fmt"
    "io"
    "io/ioutil"
    "net/http"
    "strings"

    "golang.org/x/text/encoding/charmap"
)

func main() {
    resp, err := http.Get("http://example.com")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer resp.Body.Close()

    rdrBody := io.Reader(resp.Body)
    contentType := strings.ToLower(resp.Header.Get("Content-Type"))
    if strings.Contains(contentType, "charset=iso-8859-1") {
        rdrBody = charmap.ISO8859_1.NewDecoder().Reader(rdrBody)
    }
    body, err := ioutil.ReadAll(rdrBody)
    if err != nil {
        fmt.Println(err)
        return
    }

    n := 256
    if n > len(body) {
        n = len(body)
    }
    fmt.Println(string(body[:n]))
}