我需要下载一些大的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
}
答案 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]))
}