我在go中有以下代码:
import (
"log"
"net/http"
"code.google.com/p/go.text/transform"
"code.google.com/p/go.text/encoding/charmap"
)
...
res, err := http.Get(url)
if err != nil {
log.Println("Cannot read", url);
log.Println(err);
continue
}
defer res.Body.Close()
我加载的页面包含非UTF-8符号。所以我尝试使用transform
utfBody := transform.NewReader(res.Body, charmap.Windows1251.NewDecoder())
但问题是,即使在这个简单的场景中它也会返回错误:
bytes, err := ioutil.ReadAll(utfBody)
log.Println(err)
if err == nil {
log.Println(bytes)
}
transform: short destination buffer
它实际上也会为bytes
设置一些数据,但在我的实际代码中我使用了goquery
:
doc, err := goquery.NewDocumentFromReader(utfBody)
哪个看到错误并且在没有数据返回时失败
我尝试将res.Body
的“块”传递给transform.NewReader
,并计算出,只要res.Body不包含非UTF8数据,它就能正常运行。当它包含非UTF8字节时,它会因上面的错误而失败。
我很陌生,不太了解发生了什么以及如何处理这个
答案 0 :(得分:4)
如果没有整个代码和示例网址,很难说出这里到底出了什么问题。
也就是说,我可以为此推荐golang.org/x/net/html/charset
包,因为它支持 char guessing 并转换为UTF 8。
func fetchUtf8Bytes(url string) ([]byte, error) {
res, err := http.Get(url)
if err != nil {
return nil, err
}
contentType := res.Header.Get("Content-Type") // Optional, better guessing
utf8reader, err := charset.NewReader(res.Body, contentType)
if err != nil {
return nil, err
}
return ioutil.ReadAll(utf8reader)
}