HTTPClient 获取网页源码出现乱码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTPClient 获取网页源码出现乱码相关的知识,希望对你有一定的参考价值。

byte[] buff = StreamTool.readInputStream(post.getResponseBodyAsStream());
String html = new String(buff);
post.releaseConnection(); //post是PostMethod的一个实例
System.out.println(html);

public class StreamTool
/**
* 从输入流中获取数据
* @param inputStream 输入流
* @return 字节数组
* @throws Exception
*/
public static byte[] readInputStream(InputStream inputStream) throws Exception

//实例化一个输出流
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//一个1024字节的缓冲字节数组
byte[] buffer = new byte[1024];
int len = 0;
//读流的基本知识
while ((len=inputStream.read(buffer)) != -1)
outputStream.write(buffer, 0, len);

//用完要关,大家都懂的
inputStream.close();
return outputStream.toByteArray();



当我输出HTML的时候 在logcat里面看到中文都是乱码 请问如何解决 我前面没有任何设置编码的代码

生成字符串的时候设置一下编码 参考技术A 最简单的解决方法是利用利用base64进行加解密吧,axis.jar,这个包,保证不会出现乱码。。

HttpClient发送请求后得到的响应内容出现部分乱码的问题

这几天爬虫出现了一个问题,用HttpClient不管是发送的Post请求还是Get请求一直出现一个问题:得到的响应内容部分乱码,请注意我的措辞,是部分乱码,一小部分,一小部分,一小部分!!!

出问题的代码在这里:

 package com.springapp.parse;

import org.apache.http.*;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

/**
 * Created by BearSmall on 2015/10/26.
 * 响应工具类
 */
public class ResponseUtils 
    /**
     * 返回响应正文(有乱码)
     * @param response
     * @return
     */
    public static String getResponseString(HttpResponse response) throws IOException 
        HttpEntity entity = response.getEntity();//响应实体类
        StringBuilder result = new StringBuilder();//响应正文
        if (entity != null) 
            String charset = getContentCharSet(entity);
            InputStream instream = entity.getContent();

            BufferedReader br = new BufferedReader(new InputStreamReader(
                    instream));
            String temp = "";
            while ((temp = br.readLine()) != null) 
                String str = new String(temp.getBytes(), "UTF-8");
                result.append(str+"\\n");
            
        
        return result.toString();
    

发现这段代码出现了乱码问题,已知的情况是:响应的正文是utf-8格式的。出问题的地方也是这个位子。由于对java编码解码理解得不是太透彻,试过很多笨办法,果然解决了部分乱码问题,但是来了个全部乱码。。。。。。。果然是个冷笑话。本来打算就这样了,反正影响不是特别大,但是越往后面这个问题越来越明显。基本上爬下来的大一点的页面都会零零散散的出现乱码现象,很是讨人嫌。

最后发现了问题的症结所在,这里跟大家分享一下:
从代码上看,没有逻辑上的错误。我们就看看细节吧。
首先从响应对象response中得到InputStream 流。然后包装成BufferredReader对象。最后一行一行的读取。但是这样读取的字符串会出现乱码,于是我们从新对读到的每一行字符串重新编码,设置成和inputstream匹配的utf-8。大面积乱码确实不见了,但是却出现小面积的乱码。。。。。。

我们再仔细想一想,我们已经知道inputStream的编码格式为utf-8,那为什么要在最后字符串都一行行读取出来了的情况下将其转化呢?难道不能用另外的方式实现处理这个utf-8,让读出来的一行行的字符串就不存在乱码,这样就省得我们一行行的去重新编码。

果然,看过InputStreamReader的构造函数后,我们发现它有一个两个参数的构造函数,另一个参数就是用来指定字符集的。于是我们果断用上。

 package com.springapp.parse;

import org.apache.http.*;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

/**
 * Created by BearSmall on 2015/10/26.
 * 响应工具类
 */
public class ResponseUtils 
    /**
     * 返回响应正文(无乱码)
     * @param response
     * @return
     */
    public static String getResponseString(HttpResponse response) throws IOException 
        HttpEntity entity = response.getEntity();//响应实体类
        StringBuilder result = new StringBuilder();//响应正文
        if (entity != null) 
            String charset = getContentCharSet(entity);
            InputStream instream = entity.getContent();

            BufferedReader br = new BufferedReader(new InputStreamReader(
                    instream,"utf-8"));
            String temp = "";
            while ((temp = br.readLine()) != null) 
                result.append(temp+"\\n");
            
        
        return result.toString();
    

另外还有其他的做法:

 package com.springapp.parse;

import org.apache.http.*;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

/**
 * Created by BearSmall on 2015/10/26.
 * 响应工具类
 */
public class ResponseUtils 
    /**
     * 返回响应正文(无乱码)
     * @param response
     * @return
     */
    public static String getResponseString(HttpResponse response) throws IOException 
        HttpEntity entity = response.getEntity();//响应实体类
        StringBuilder result = new StringBuilder();//响应正文
        if (entity != null) 
            InputStream instream = entity.getContent();
            byte[] bytes = new byte[4096];
            int size = 0;
            try 
                while ((size = instream.read(bytes)) > 0) 
                    String str = new String(bytes, 0, size, "utf-8");
                    result.append(str);
                
             catch (IOException e) 
                e.printStackTrace();
             finally 
                try 
                    instream.close();
                 catch (IOException e) 
                    e.printStackTrace();
                
            
        
        return result.toString();

这里由于没有使用包装类,所以需要自己编码解码。但是这里和第一个那种出现乱码的方式还是有区别的,虽然都是自己编码解码,但是这里是对纯的inputStream进行的操作,中间不涉及包装类的额外编码附操作。

以上是关于HTTPClient 获取网页源码出现乱码的主要内容,如果未能解决你的问题,请参考以下文章

httpclient下载网页源码---java基础爬虫

jsoup入门

jsoup入门

解决中文乱码问题

jsoup教程

文件名乱码怎么恢复