去编码转换问题

时间:2015-07-27 11:03:01

标签: encoding go

我在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字节时,它会因上面的错误而失败。

我很陌生,不太了解发生了什么以及如何处理这个

1 个答案:

答案 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)
}

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