【发布时间】:2019-05-09 01:30:30
【问题描述】:
package main
import (
"bufio"
"io"
"golang.org/x/net/html/charset"
"golang.org/x/text/encoding"
"net/http"
"fmt"
"golang.org/x/text/transform"
"io/ioutil"
)
// main
func main() {
resp, err := http.Get("http://www.baidu.com")
if err != nil {
panic(err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
fmt.Println("Error: status code", resp.StatusCode)
return
}
e := determineEncoding(resp.Body)
utf8Reader := transform.NewReader(resp.Body, e.NewDecoder())
all, err := ioutil.ReadAll(utf8Reader)
if err != nil {
panic(err)
}
fmt.Printf("%s\n", all)
}
// determine
func determineEncoding(r io.Reader) encoding.Encoding {
reader := bufio.NewReader(r)
// The start position was not correct
bytes, err := reader.Peek(1024)
if err != nil {
panic(err)
}
e, _, _ := charset.DetermineEncoding(bytes, "")
return e
}
结果不是正确的数据。起始位置不为零。
正如文档描述的那样,'Peek 返回下一个 n 字节而不推进读者。字节在下一次读取调用时停止有效。如果 Peek 返回少于 n 个字节,它还会返回一个错误,解释为什么读取很短。如果 n 大于 b 的缓冲区大小,则错误为 ErrBufferFull。'
【问题讨论】:
标签: go