网页抓取乱码的核心原因是解码编码与网页实际编码不一致,解决关键是动态识别真实编码:优先从http响应头的content-type提取charset,其次解析html中meta标签的charset,最后fallback至utf-8或gbk,并注意gzip解压与响应流缓存。

网页抓取乱码,核心原因是读取时用的编码和网页实际编码不一致。比如网页是 UTF-8 编码,你用 GBK 去解码,字节对不上,自然显示为“锟斤拷”或方块。解决的关键不是硬写死一种编码,而是动态识别网页真实编码,再按需解码。
优先从 HTTP 响应头获取 charset
服务器在返回 HTML 时,通常会在响应头中声明编码,例如:
Content-Type: text/html; charset=utf-8这是最可靠的信息源。Java 中可用 HttpURLConnection 或 HttpClient 获取响应头:
- 调用
connection.getContentType()或response.getFirstHeader("Content-Type") - 用正则或字符串解析提取
charset=xxx后面的值(注意忽略大小写和空格) - 若成功提取(如 "utf-8"、"gbk"、"gb2312"),直接用于后续解码
响应头没 charset 就查 HTML 的 标签
很多网站不规范,响应头不带 charset,但会在 HTML 的 中写明,例如:
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











