最近项目中遇到这样一个坑:
某一接口的HttpUrlConnection的请求返回结果为乱码,但PC浏览器直接打开是正常的。
效果图如下:
这里写图片描述

经过查阅代码发现,该接口的对应Header中有这么一段代码:

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

那么Accept-Encoding为gzip,deflate代表什么意思呢?

Accept-Encoding为gzip,deflate的含义

Accept-Encoding是用来设置从服务端返回的数据是否进行gzip压缩(gzip是一种数据格式,默认目前仅使用deflate算法压缩data部分)。
也就是说,如果客户端设置了gzip,deflate,等于告诉服务端,客户端是支持gzip格式的数据解压缩的。
若服务端支持gzip,deflate压缩方式,则客户端收到的数据则为gzip格式压缩的。

第一种解决方案:

直接去掉headers.put(“Accept-Encoding”, “gzip,deflate”);
项目中,我们也是采用的此方法。

第二种解决方案:

解码服务端返回的gzip格式压缩的数据。

以下这段代码来自: http://blog.csdn.net/lzwglory/article/details/19548603
这里我并没有经过验证,直接copy过来的。

private String zipInputStream(InputStream is) throws IOException {  
    GZIPInputStream gzip = new GZIPInputStream(is);  
    BufferedReader in = new BufferedReader(new InputStreamReader(gzip, "UTF-8"));  
    StringBuffer buffer = new StringBuffer();  
    String line;  
    while ((line = in.readLine()) != null)  
        buffer.append(line + "\n");  
    is.close();  
    return buffer.toString();  

参考:
http://blog.csdn.net/tangzhide/article/details/53535543
http://www.bkjia.com/Javabc/1012944.html
http://blog.csdn.net/lzwglory/article/details/19548603

最近项目中遇到这样一个坑: 某一接口的HttpUrlConnection的请求返回结果为乱码,但PC浏览器直接打开是正常的。 效果图如下: 经过查阅代码发现,该接口的对应Header中有这么一段代码:headers.put("Accept-Encoding", "gzip,deflate");那么Accept-Encoding为gzip,deflate代表什么意思呢?Accept-Encodi
本文会使用Fiddler来查看HTTP request和Response, 如果不熟悉这个工具,可以先参考[Fiddler教程] HTTP压缩是指: Web服务器和浏览器之间压缩传输的”文本内容“的方法。 HTTP采用通用的压缩算法,比如gzip来压缩HTML,Javascript, CSS文件。 能大大减少网络传输的数据量,提高了用户显示网页的速度。当然,同时会增加一点点服务器的开销。 本文从HTTP协议的角度,来理解HTTP压缩这个概念。 HTTP内容编码和HTTP压缩的区别 其中request的header中,设置Accept-Encodinggzip,deflate: req = (HttpWebRequest)WebRequest.Create(gSkydriveUrl); req.Headers.Add("Accept-Encoding", "gzip,deflate"); 结果始终返回乱码
HTTP 请求头 Accept-Encoding 会将客户端能够理解的内容编码方式——通常是某种压缩算法——进行通知(给服务端)。通过内容协商的方式,服务端会选择一个客户端提议的方式,使用并在响应头Content-Encoding 中通知客户端该选择。 ​ 今天我们就来看一看最常见的gzip压缩方式 ​ 压缩原理 ​ gzip使用deflate算法进行压缩。具体就是将要压缩的文件先使用LZ77算法的一个变种进行压缩,对得到的结果再使用Huffman编码的方法进行压缩。 首先介绍下
我们在爬虫做请求的时候,一般会在request中添加请求头:Accept-Encoding,往往会指定方式为“gzip,deflate,br”三种压缩方式。 gzipdeflate为传统的压缩格式 br指的是Brotli,Google在2015年时候发布的新的数据压缩算法,而我们的工具request的response等文本只支持gzip,deflate格式的解压缩,还不支持br形式的解压...
在爬取网页时,如果网页的编码格式是gzipdeflate或br,则需要对网页进行解压缩,才能正确读取其中的内容。可以使用Python的requests库来实现自动解压缩,示例代码如下: ``` python import requests from io import BytesIO import gzip url = 'https://www.example.com' headers = {'Accept-Encoding': 'gzip, deflate, br'} response = requests.get(url, headers=headers) if response.headers.get('Content-Encoding') == 'gzip': # 如果网页使用gzip压缩,则解压缩网页内容 content = gzip.GzipFile(fileobj=BytesIO(response.content)).read().decode('utf-8') else: # 否则直接读取网页内容 content = response.content.decode('utf-8') # 处理网页内容,避免中文乱码 # ... 在上述代码中,首先使用requests库发送带有Accept-Encoding头部信息的GET请求,如果服务器返回的响应头中包含Content-Encoding: gzip,则说明网页使用gzip压缩,需要对网页内容进行解压缩。解压缩后得到的内容是二进制数据,需要使用decode('utf-8')方法将其转换为字符串,然后就可以对网页内容进行处理,避免中文乱码问题。