Golang读取响应体时如何获取可读的Unicode字符字符串?
解决波兰语网站爬取乱码问题
乱码的核心原因是你直接用Go默认的UTF-8解码响应字节,但目标网站使用的是其他编码(比如ISO-8859-2、Windows-1250这类波兰语常用编码),导致特殊字符(ź、ę等)解析错误。
解决步骤:
确定网站的实际编码
优先从响应头的Content-Type字段提取编码信息,比如字段值可能是text/html; charset=ISO-8859-2,其中ISO-8859-2就是目标编码。使用对应编码解码响应内容
Go标准库未内置所有字符集编码,需要借助golang.org/x/text/encoding系列包来处理非UTF-8编码的内容。
完整代码示例
1. 导入依赖包
import ( "io" "mime" "net/http" "golang.org/x/text/encoding/charmap" "golang.org/x/text/transform" )
2. 带编码解析的爬取逻辑
func main() { resp, err := http.Get("https://目标波兰语网站URL") if err != nil { // 处理请求错误 return } defer resp.Body.Close() // 从Content-Type头解析编码 var decoder transform.Transformer contentType, params, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) if err == nil { if charset, ok := params["charset"]; ok { switch charset { case "ISO-8859-2": decoder = charmap.ISO8859_2.NewDecoder() case "windows-1250": decoder = charmap.Windows1250.NewDecoder() case "utf-8": // 编码为UTF-8,无需转换 decoder = nil default: // 未知编码,可默认用UTF-8或返回错误 decoder = nil } } } // 读取并转换编码 var bodyString string if decoder != nil { reader := transform.NewReader(resp.Body, decoder) bodyBytes, err := io.ReadAll(reader) if err != nil { // 处理读取错误 return } bodyString = string(bodyBytes) } else { // 默认用UTF-8解码 bodyBytes, err := io.ReadAll(resp.Body) if err != nil { // 处理读取错误 return } bodyString = string(bodyBytes) } // 现在bodyString是可读的波兰语文本,可用于html包解析或字符串处理 println(bodyString) }
补充说明
- 如果网站未在
Content-Type头声明编码,可能需要通过HTML的<meta charset="xxx">标签提取编码,这时候需要先读取部分字节,解析meta标签里的编码信息,再重新解码整个响应体。 golang.org/x/text/encoding/charmap包包含了常见的西欧、东欧字符集编码,足够覆盖波兰语网站的需求。
内容的提问来源于stack exchange,提问作者Fergus Johnson
相关产品推荐
相关产品推荐

