请求网站响应回的文本带有乱码,Content-encoding:gzip

今天写爬虫请求网站后,返回的数据中有乱码,怎么转都转不了。

后来研究了一番,应该是Content-encoding惹的祸:

废话少说:

  • 先说解决方案,然后再说原理

一、解决方案:

第一种:

把请求头Accept-Encoding去掉

//map.put("Accept-Encoding", "gzip, deflate");

但是可能返回的数据还有乱码,那我们就可以用Java字符串的方式来处理:

String result = new String(responseBody.getBytes("ISO-8859-1"),"UTF-8");

第二种:

找到对应的解压算法,将字符串解压:

因为我爬取的网站响应头中Content-Encoding:的属性值为gzip,所以我就用gzip的解压算法来解压

/*** GZIP解压字符串* 解决Content-Encoding: gzip 的问题* @param str 源字符串* @return* @throws IOException*/
public static String uncompressString(String str) throws IOException {if (str == null || str.length() == 0) {return str;}ByteArrayOutputStream out = new ByteArrayOutputStream();ByteArrayInputStream in = new ByteArrayInputStream(str.getBytes("ISO-8859-1"));GZIPInputStream gunzip = new GZIPInputStream(in);byte[] buffer = new byte[256];int n;while ((n = gunzip.read(buffer)) >= 0) {out.write(buffer, 0, n);}return out.toString();
}

二、原理

Content-EncodingAccept-Encoding在一起协商。

Accept-Encoding设置在请求头当中,会告诉服务器,我可以接受哪种编码压缩。

Content-Encoding设置在响应头中,会告诉客户端,我用的是哪种编码压缩。

他们俩个算是一个协商的作用。

比如说:

客户端发送请求带有表明我可以接受gzipdeflate两种压缩方式,

Accept-Encoding: gzip, deflate

服务器在 Content-Encoding 响应首部提供了实际采用的压缩模式:

Content-Encoding: gzip

PS: 服务器端并不强制要求一定使用何种压缩模式。采用哪种压缩方式高度依赖于服务器端的设置,及其所采用的模块。

Content-Encoding

引用一个MDN上的话:

Content-Encoding 是一个实体消息首部,用于对特定媒体类型的数据进行压缩。当这个首部出现的时候,它的值表示消息主体进行了何种方式的内容编码转换。这个消息首部用来告知客户端应该怎样解码才能获取在 Content-Type 中标示的媒体类型内容。

一般建议对数据尽可能地进行压缩,因此才有了这个消息首部的出现。不过对于特定类型的文件来说,比如jpeg图片文件,已经是进行过压缩的了。有时候再次进行额外的压缩无助于负载体积的减小,反而有可能会使其增大。

翻译为人话就是说:

Content-Encoding就是对数据进行了编码压缩,从而起到了压缩数据的作用。

  • 优点: 大大提高了传输的效率。

目前有以下五种形式:

Content-Encoding: gzip
Content-Encoding: compress
Content-Encoding: deflate
Content-Encoding: identity
Content-Encoding: br

每一种形式就对应这一种压缩算法。

Content-Encoding: gzip

  • 表示采用 Lempel-Ziv coding (LZ77) 压缩算法,以及32位CRC校验的编码方式。这个编码方式最初由 UNIX 平台上的 gzip 程序采用。出于兼容性的考虑, HTTP/1.1 标准提议支持这种编码方式的服务器应该识别作为别名的 x-gzip指令。

Content-Encoding: compress

  • 采用 Lempel-Ziv-Welch (LZW) 压缩算法。这个名称来自UNIX系统的 compress 程序,该程序实现了前述算法。与其同名程序已经在大部分UNIX发行版中消失一样,这种内容编码方式已经被大部分浏览器弃用,部分因为专利问题(这项专利在2003年到期)。

Content-Encoding: deflate

  • 采用 zlib 结构 (在 RFC 1950 中规定),和 deflate 压缩算法(在 RFC 1951 中规定)。

Content-Encoding: identity

  • 用于指代自身(例如:未经过压缩和修改)。除非特别指明,这个标记始终可以被接受。

Content-Encoding: br

  • 表示采用 Brotli 算法的编码方式。

Accept-Encoding

HTTP 请求头 Accept-Encoding 会将客户端能够理解的内容编码方式——通常是某种压缩算法——进行通知(给服务端)。通过内容协商的方式,服务端会选择一个客户端提议的方式,使用并在响应头 Content-Encoding 中通知客户端该选择。

几种形式:

Accept-Encoding: gzip
Accept-Encoding: compress
Accept-Encoding: deflate
Accept-Encoding: br
Accept-Encoding: identity
Accept-Encoding: *

其中有些指令在Content-Encoding已经说过了,就不在赘述。说一下上边没说过的:

*

  • 匹配其他任意未在该请求头字段中列出的编码方式。假如该请求头字段不存在的话,这个值是默认值。它并不代表任意算法都支持,而仅仅表示算法之间无优先次序。

;q=

  • 值代表几种算法的优先级,又称为权重。

例如:

Accept-Encoding: gzipAccept-Encoding: gzip, compress, brAccept-Encoding: br;q=1.0, gzip;q=0.8, *;q=0.1
// 表示几种压缩算法的优先级,br > gzip > *

请求网站响应的文本带有乱码,原来是Content-encoding惹的祸,一文带你搞懂`Content-encoding`、`Accept-Encoding`相关推荐

  1. 【微信小程序】一文带你搞懂小程序的页面配置和网络数据请求

    文章目录 页面配置 页面配置文件的作用 页面配置和全局配置的关系 页面配置 网络数据请求 网络数据请求的限制 配置request合法域名 发起get/post请求 在页面刚加载时请求数据 跳过requ ...

  2. JMeter的PUT请求,响应结果中文出现乱码的解决方法

    一.发现问题 1.接口的方法是PUT请求,Body Data传的"name"和"description"参数是中文的,编码格式也填了"UTF-8&qu ...

  3. 工业品MRO采购网站有哪些优势?一文带你读懂

    随着互联网电商的迅速发展,越来越多的工业品企业开始寻求新的突破口,很多MRO商城网站应运而生,这种"互联网+工业"的新型数字化采购模式,能够将数字能力及技术优势贯穿企业管理全流程, ...

  4. nginx过滤post请求头_Nginx Header,实现对HTTP/S请求、响应进行添加、修改、删除等操作...

    Nginx Header,实现对HTTP/S请求.响应进行添加.修改.删除等操作 通过Nginx内置 文档地址: http://nginx.org/en/docs/http/ngx_http_head ...

  5. Java 技术篇 - 启动web服务接收浏览器请求并响应实例演示,解决socket响应浏览器显示中文乱码问题,web服务response响应设置浏览器显示字体方法

    先看下效果图: 我通过 127.0.0.1:10010 访问我启用服务的效果图. 后台接收到的前台请求如下: GET / HTTP/1.1 Host: 127.0.0.1:10010 Connecti ...

  6. formdata 接受参数中带有class 对象_Django(五)- 请求与响应 - request对象

    请求对象 一.客户端传参的几种方式 1. 通过URL路径(path)传递,例如:http://127.0.0.1:8000/news/1/2,两个参数:id和page 2. 通过 query stri ...

  7. [Python爬虫] 一、爬虫原理之HTTP和HTTPS的请求与响应

    一.HTTP和HTTPS HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法. HTTPS(Hypertext Transfe ...

  8. JavaWeb | HTTP 协议请求与响应格式

    一.HTTP 是什么 计算机网络核心概念:网络协议 网络协议种类非常多,其中一些耳熟能详的,IP,TCP,UD- 其中还有一个应用非常广泛的协议HTTP,HTTP 协议大概率是咱们日后开发中用的最多的 ...

  9. wireshark Fiddler抓包分析与解密https Fiddler修改https请求和响应

    Https理论 在说HTTPS之前先说说什么是HTTP,HTTP就是我们平时浏览网页时候使用的一种协议.HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全.为 ...

最新文章

  1. Android定位方式和测试方法
  2. Java项目:嘟嘟二手书商城系统(java+JSP+Springboot+maven+mysql+ThymeLeaf+FTP)
  3. 机器学习数据预处理之离群值/异常值:箱图法(boxplot method)
  4. No Code的世界绝无代码!GitHub CEO:编码的未来根本就没有编码
  5. 获取服务(getService)
  6. 使用网站模板快速建站_建站工具使用教程看了就懂网站建设
  7. 开启mysql日志记录_Mysql开启日志记录
  8. iOS开发——处理1000张图片的内存优化
  9. mysql异步查询 java_基于 mysql 异步驱动的非阻塞 Mybatis
  10. java调用python脚本_调用Python写vb的脚本方法
  11. 计算机图形学------空间摄像机
  12. Maxent猛犸反欺诈入选Gartner 2018 Cool Vendors
  13. yuki翻译器钩子_GalGame 翻译器
  14. 手机模拟门禁卡 — 加密门禁卡模拟教程
  15. 大数据是什么?多大的数据叫大数据?
  16. 网吧收银费用计算的对象及算法设计
  17. 交换机,路由器和防火墙
  18. 【企业微信实现免密登录以及发送消息(企业内部应用)】
  19. Node如何去除短视频水印?
  20. linux设置网关和ip

热门文章

  1. JavaScript: 世界上最被误解的语言|Douglas Crockford
  2. FPGA交通灯 Verilog Modelsim
  3. 产品之 2B、2C与2G
  4. SQL高级语法学习总结(一)
  5. luogu 4084
  6. 海外并购不失为好时机
  7. 计算机在中药材的应用,计算机在中医药中的应用
  8. 尝试EFM32下的fatfs的使用
  9. 爆炸的符卡洋洋洒洒 (01背包
  10. 2018年工商银行软件开发中心面试总结