HttpClient请求中文乱码详解

HttpClient 请求的中文乱码问题
相关类库:
commons-codec-1.3.jar,commons-httpclient-3.1.jar,commons-logging-1.1.1.jar

使用方法setContentCharset();
这里以GetMethod为例:
如果请求的页面编码为GB2312
其它部分略
GetMethod getMethod = new GetMethod("http://www.baidu.com");
//设置页面编码
getMethod.getParams().setContentCharset("GB2312");

基本上设置请求部分完成了
下面是对请求的页面读取的解析
最简单的方式是直接输出页面,这里基本上不需要任何设置。
System.out.println(getMethod.getResponseBodyAsString());

当然你也可以使用流方式读取
InputStream in = getMethod.getResponseBodyAsStream();
//这里的编码规则要与上面的相对应
BufferedReader br = new BufferedReader(new InputStreamReader(in,"GB2312"));
String tempbf;
StringBuffer html = new StringBuffer(100);
while ((tempbf = br.readLine()) != null) {
	html.append(tempbf +"\n");
}
System.out.println(html.toString());

当然还可以使用这样的方式,因为默认是使用ISO-8859-1,无非就是多进行了几次转码
InputStream in = getMethod.getResponseBodyAsStream();
//这里使用8859-1读取
BufferedReader br = new BufferedReader(new InputStreamReader(in,"ISO-8859-1"));
String tempbf;
StringBuffer html = new StringBuffer(100);
while ((tempbf = br.readLine()) != null) {
	html.append(tempbf +"\n");
}
//将8859-1再次转成GB2312
System.out.println(new String(html.toString().getBytes("ISO-8859-1"),"GB2312"));

我还是建议使用第一种方法,但我认为本质上是一致的
对于请求部分还可以通过如下几种方式进行设置
getMethod.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET,"GB2312");

getMethod.addRequestHeader("Content-Type", "text/html; charset=UTF-8");

这里我只是给予大家参考,实际上etContentCharset()就可以了,如果那个页面通过上述方法不能成功读取,也请指明。
如果大家有更好的方法 也请告知。





长春生活网

你可能感兴趣的:(java,apache,json,Ajax,Google)