Как получить веб-страницу с помощью Go и преобразовать ее в UTF-8 - PullRequest
0 голосов
/ 04 июля 2018

Мне нужно скачать несколько больших HTML-файлов (около 300 КБ +). Все работает нормально, проблема в том, что некоторые файлы поставляются с символами 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 голосов
/ 04 июля 2018

Что-то вроде:

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]))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...