去了编码转换问题(Go encoding transform issue)

2019-10-24 05:15发布

我在旅途中下面的代码:

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())

但问题是,它甚至在这个简单的scenarion返回错误:

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.Bodytransform.NewReader和figuried出来,只要res.Body不包含非UTF8数据效果很好。 而当它包含非UTF8字节的失败与上述错误。

我是很新的去,真的不明白这是怎么回事,如何解决这个问题

Answer 1:

如果没有用一个例子URL沿着整个代码很难说究竟是怎么回事错在这里。

这就是说,我可以推荐golang.org/x/net/html/charset包这个,因为它同时支持字符猜测和转换为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)
}

完整的例子: http://play.golang.org/p/olcBM9ughv



文章来源: Go encoding transform issue
标签: encoding go