【问题标题】:After called Peek method, the origin data has changed调用 Peek 方法后,原始数据发生了变化
【发布时间】: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


    【解决方案1】:

    Peek 返回接下来的 n 个字节而不推进阅读器。

    这是指*bufio.Reader,而不是底层读者。如果需要,缓冲读取器从底层读取器读取。否则它将如何返回字节?

    在您的情况下,您必须在调用 determineEncoding 后直接停止使用响应正文并改用 *bufio.Reader。

    例如:

    func determineEncoding(r *bufio.Reader) encoding.Encoding {
        bytes, err := r.Peek(1024)
    
        // as before
    }
    
    func main() {
        // as before
    
        defer resp.Body.Close()
    
        r := bufio.NewReader(resp.Body)
        e := determineEncoding(r)
        utf8Reader := transform.NewReader(r, e.NewDecoder())
    
        // as before
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-15
      • 1970-01-01
      • 2017-08-26
      • 2013-05-13
      • 1970-01-01
      • 2016-11-23
      • 1970-01-01
      相关资源
      最近更新 更多