`

HttpClient请求中文乱码详解

    博客分类:
  • J2SE
阅读更多
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()就可以了,如果那个页面通过上述方法不能成功读取,也请指明。
如果大家有更好的方法 也请告知。





长春生活网
5
0
分享到:
评论
6 楼 w_mojian180 2014-10-17  
getParams().setContentCharset("UTF-8"); 依然乱码 不知和解
5 楼 bluestome 2011-06-14  
测试中文发布内容,不好意思拿你的帖子做实验!
4 楼 sysmaid 2009-12-30  
用getMethod.addRequestHeader("Content-Type", "text/html; charset=UTF-8");   没起作用
用post.getParams().setContentCharset("UTF-8");才可以
搞不懂这api是怎么设计的
3 楼 bdceo 2009-11-11  
最近在做一个获取Google的翻译,用的也是Httpclient,乱码也是很大的问题,头疼了好几天...也懒得去看HttpClient的源码...哎,就在google上一个一个得搜索解决方案,没想到今天在这儿解决了。
首先很感谢博主的解决方案,
然后呢,也在这儿晒晒我的google翻译...哈哈,献丑了。
发现博主提示的
post.getParams().setContentCharset("UTF-8");

这行代码,彻底解决了乱码问题。  
private static final String URL = "http://ajax.googleapis.com/ajax/services/language/translate";
/**
	 * 获取Google翻译
	 * 
	 * @param 待翻译内容
	 * @param true:中翻英,false:英翻中
	 * @return 返回翻译后的内容
	 */
	private synchronized static String doTranslate(String text, boolean flag) {
		String result = "";
		HttpClient client = null;
		PostMethod post = null;
		try {
			client = new HttpClient();
			post = new PostMethod(URL);
			NameValuePair[] params = {
					new NameValuePair("v", "1.0"),
					new NameValuePair("q", text),
					new NameValuePair("langpair", flag ? "zh-CN|en"
							: "en|zh-CN") };
			post.setRequestBody(params);
			[color=red]post.getParams().setContentCharset("UTF-8");[/color]			int status = client.executeMethod(post);
			if (status == HttpStatus.SC_OK) {
				result = post.getResponseBodyAsString();
			} else {				logger.error(">>>>>>>>> 请求翻译 :\"" + text
						+ "\" 时失败,\nHttp返回的状态码是:" + status + ",时间:"
						+ sdf.format(new Date()) + "<<<<<<<<<<");
			}
		} catch (Exception e) {
			e.printStackTrace();
			logger.error("请求Google翻译时出错:" + GoogleTranslate.class.getName()
					+ ":" + e.getMessage());
		} finally {
			if (post != null) {
				post.releaseConnection();
				post = null;
				client = null;
			}
		}
		return parseJSON(result);
	}
private synchronized static String parseJSON(String src) {
		String result = "";
		try {
			JSONObject json = new JSONObject(src);
			JSONObject obj = json.getJSONObject("responseData");
			if (obj != null) {
				result = obj.getString("translatedText");
				result = result.replaceAll("% 26", "&");
			}
		} catch (Exception e) {
			e.printStackTrace();
			logger.error("解析Google返回的JSON数据时出错:"
					+ GoogleTranslate.class.getName() + ":" + e.getMessage());
		}
		return result;
	}
2 楼 llying 2009-02-19  
gml520 写道

我最近也在 也在用HttpClient ,也遇到了中文乱码问题,比如:url="http://www.blcu.edu.cn/financial/musicclub/02-sunyanzi/CD3/05%20-%20星期一天气晴我离开你.mp3"调用: GetMethod getMethod = new GetMethod(url);报url异常:java.lang.IllegalArgumentException: Invalid uri 'http://www.blcu.edu.cn/financial/musicclub/02-sunyanzi/CD3/05%20-%20星期一天气晴我离开你.mp3': escaped absolute path not validat org.apache.commons.httpclient.HttpMethodBase.&lt;init&gt;(HttpMethodBase.java:219)at org.apache.commons.httpclient.methods.GetMethod.&lt;init&gt;(GetMethod.java:88)

GetMethod getMethod = new GetMethod("http://www.blcu.edu.cn/financial/musicclub/02-sunyanzi/CD3/"+URLEncoder.encode("05%20-%20星期一天气晴我离开你.mp3","UTF-8"));
1 楼 gml520 2009-02-18  
我最近也在 也在用HttpClient ,也遇到了中文乱码问题,

比如:
url="http://www.blcu.edu.cn/financial/musicclub/02-sunyanzi/CD3/05%20-%20星期一天气晴我离开你.mp3"

调用: GetMethod getMethod = new GetMethod(url);

报url异常:
java.lang.IllegalArgumentException: Invalid uri 'http://www.blcu.edu.cn/financial/musicclub/02-sunyanzi/CD3/05%20-%20星期一天气晴我离开你.mp3': escaped absolute path not valid

at org.apache.commons.httpclient.HttpMethodBase.<init>(HttpMethodBase.java:219)
at org.apache.commons.httpclient.methods.GetMethod.<init>(GetMethod.java:88)

相关推荐

    HttpClient 4文件上传

    ### HttpClient 4 文件上传知识点详解 #### 一、概述 在Java开发中,经常会遇到需要通过HTTP协议上传文件的需求。Apache HttpClient是一个强大的客户端HTTP组件,它不仅支持HTTP协议,还能处理HTTPS请求,并提供了...

    commons-httpclient-3.1短信发送包

    《使用Apache Commons HttpClient 3.1进行短信发送详解》 在Java开发中,发送短信是一项常见的功能,尤其在验证码验证、通知服务等方面有着广泛的应用。Apache Commons HttpClient 3.1是一个强大的HTTP客户端库,它...

    httpClient学习.doc

    这可能会导致中文乱码的问题。为了避免此类问题,可以指定字符编码: ```java String charset = "UTF-8"; // 或者 "GBK", "ISO-8859-1" 等 String responseString = new String(getMethod.getResponseBody(), ...

    Charles_N:HTTP请求响应监听工具

    ### Charles_N:HTTP请求响应监听工具详解 #### 一、Charles简介 Charles是一个强大的HTTP代理服务器、HTTP监视器以及反转代理服务器。它主要用于帮助开发者查看所有的HTTP通信,这对于理解和调试Web应用至关重要...

    Java获取网页数据步骤方法详解

    这个过程主要包括使用HttpClient请求网页、获取网页源码、查看源码是否有需要提取的数据、对源码进行拆解、获取需要的数据对自己创建的对象赋值、数据提取保存等步骤。 第一步:通过HttpClient请求到达某网页的url...

    android移动互联笔记

    ### Android移动互联知识点详解 #### 一、HTTP通信与Socket通信概述 在Android移动互联领域,网络编程是一项核心技能。本文将重点介绍两种常见的网络通信技术:HTTP通信和Socket通信。 - **HTTP通信**:主要用于...

    java实现模拟登录网站最全的资料

    使用HTMLParser或其他解析库时,需要正确识别和设置编码,以避免乱码问题。 4. **HTMLParser库**:HTMLParser是一个Java库,用于解析HTML文档并提取有用的信息。它可以解析HTML标记、属性、文本等,对于提取网页...

    httpmime-4.3.6.rar

    在发送包含中文文件名的请求时,框架会正确地编码文件名,避免了乱码现象。然而,确保服务器端也支持正确的编码方式是非常关键的。在发送请求前,你需要设置合适的字符集,如`"charset=UTF-8"`,以保证信息传输的...

    使用JAVA实现http通信详解

    - 数据编码:确保在发送和接收数据时正确处理字符编码,避免乱码问题。 - 错误处理:对可能出现的异常进行捕获和处理,保证程序的健壮性。 - 安全性:对于敏感信息,使用 HTTPS 协议来加密通信,增强数据安全性。...

    支付宝jsp接口

    1. **字符编码**:在处理中文字符时,确保服务器、数据库和JSP页面的编码统一,避免乱码问题。 2. **错误处理**:充分考虑可能出现的异常情况,如网络连接失败、签名错误、参数不合法等,要有完善的错误处理机制。 ...

    工作日志_李响115_202109021

    【知识点详解】 在李响的工作日志中,主要涉及了几个关键的技术点,包括Web应用开发、搜索引擎服务的搭建和使用、数据导入以及服务间的通信。以下是对这些知识点的详细说明: 1. **Webapp的Maven工程创建**: ...

    C#简单实现网络爬虫

    **C#实现网络爬虫详解** 网络爬虫是一种自动化程序,用于从互联网上抓取大量信息,以便进行数据分析、搜索引擎索引或者特定目的的数据挖掘。在C#中,我们可以利用.NET框架提供的各种类库来创建自己的网络爬虫。本文...

    android开发资料

    - 解决网络通信中可能出现的中文乱码问题的方法。 **8.5 WebKit应用** - **8.5.1 WebKit概述**: WebKit是一个开源的浏览器引擎,Android使用它来提供浏览网页的功能。 - **8.5.2 WebView浏览网页**: 使用WebView...

    Java面试宝典2018

    - MyBatis的配置文件详解。 - 动态SQL的实现方法。 - **常见面试题**: - MyBatis与Hibernate的主要区别? - **9.4 Struts2框架** - **知识点概述**: - Struts2的核心组件。 - Action的执行流程。 - ...

Global site tag (gtag.js) - Google Analytics