使用apache的HttpGet\HttpPost获取返回内容编码问题
2014-05-23 12:25
399 查看
今天遇到了一个小问题,简单研究了一下,同时记录一下。
关于apache的HttpGet\HttpPost请求,做了一次访问,代码如下:
结果出现了乱码。立刻对代码进行修改BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"));
依旧出现乱码,到底是哪里出问题?
如果用第7行的方式来获取的话就不会有乱码。
第7行的方法很简单,深入研究下实际上也是获取流进行处理,只是在过程中加入了编码处理,那么到底是怎么处理的?
该方法源码如下:
可以看见是在InputStreamReader这里处理的。和我处理的地方是一致的,那么还有什么问题?
后来仔细一看发现toString()方法传入的编码方式未必就是最后使用的,这中间还有个判断,就是判断HttpEntity返回的header是否存在charset,不存在才会使用传入的参数。
本来我一直认为这个参数就应该是utf-8,结果用EntityUtils的getContentCharSet方法一获取才发现是GBK。。。
这下就清楚了,修改代码BufferedReader
reader = new BufferedReader(new InputStreamReader(is, "gbk"));
这回不是乱码了,不过这部分应该在前面做好判断,先用getContentCharSet获取一下,如果是空再自己设定一个才好。
至于getContentCharSet方法如何实现的,代码如下:
关于apache的HttpGet\HttpPost请求,做了一次访问,代码如下:
String url = "http://xxxxxxx"; HttpGet httpGet = new HttpGet(url); HttpClient httpClient = new DefaultHttpClient(); try { HttpResponse httpResponse = httpClient.execute(httpGet); HttpEntity httpEntity = httpResponse.getEntity(); //String result = EntityUtils.toString(httpEntity, "utf-8"); InputStream is = null; is = httpEntity.getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); String result = ""; String line = ""; while ((line = reader.readLine()) != null) { result = result + line; } System.out.println(result); } catch (Exception e) { e.printStackTrace(); }
结果出现了乱码。立刻对代码进行修改BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"));
依旧出现乱码,到底是哪里出问题?
如果用第7行的方式来获取的话就不会有乱码。
第7行的方法很简单,深入研究下实际上也是获取流进行处理,只是在过程中加入了编码处理,那么到底是怎么处理的?
该方法源码如下:
public static String toString( final HttpEntity entity, final String defaultCharset) throws IOException, ParseException { if (entity == null) { throw new IllegalArgumentException("HTTP entity may not be null"); } InputStream instream = entity.getContent(); if (instream == null) { return ""; } if (entity.getContentLength() > Integer.MAX_VALUE) { throw new IllegalArgumentException("HTTP entity too large to be buffered in memory"); } int i = (int)entity.getContentLength(); if (i < 0) { i = 4096; } String charset = getContentCharSet(entity); if (charset == null) { charset = defaultCharset; } if (charset == null) { charset = HTTP.DEFAULT_CONTENT_CHARSET; } Reader reader = new InputStreamReader(instream, charset); CharArrayBuffer buffer = new CharArrayBuffer(i); try { char[] tmp = new char[1024]; int l; while((l = reader.read(tmp)) != -1) { buffer.append(tmp, 0, l); } } finally { reader.close(); } return buffer.toString(); }
可以看见是在InputStreamReader这里处理的。和我处理的地方是一致的,那么还有什么问题?
后来仔细一看发现toString()方法传入的编码方式未必就是最后使用的,这中间还有个判断,就是判断HttpEntity返回的header是否存在charset,不存在才会使用传入的参数。
本来我一直认为这个参数就应该是utf-8,结果用EntityUtils的getContentCharSet方法一获取才发现是GBK。。。
这下就清楚了,修改代码BufferedReader
reader = new BufferedReader(new InputStreamReader(is, "gbk"));
这回不是乱码了,不过这部分应该在前面做好判断,先用getContentCharSet获取一下,如果是空再自己设定一个才好。
至于getContentCharSet方法如何实现的,代码如下:
public static String getContentCharSet(final HttpEntity entity) throws ParseException { if (entity == null) { throw new IllegalArgumentException("HTTP entity may not be null"); } String charset = null; if (entity.getContentType() != null) { HeaderElement values[] = entity.getContentType().getElements(); if (values.length > 0) { NameValuePair param = values[0].getParameterByName("charset"); if (param != null) { charset = param.getValue(); } } } return charset; }
相关文章推荐
- c++ builder2010 indy控件idhttp, post页面获取数据(要注意编码的问题,双方都使用UTF-8最好)
- Java用org.apache.http.client的HttpClient发送Post请求 可获取返回Header
- Java用org.apache.http.client的HttpClient发送Post请求 可获取返回Header
- Java用org.apache.http.client的HttpClient发送Post请求 可获取返回Header
- Java--org.apache.http.client的HttpClient发送Post请求,获取返回Header
- ionic使用常见问题(八)——PHP无法获取$http的post数据
- 使用 idHTTP 获取 UTF-8 编码的中文网页 - 回复同学 "Delphi学习者" 的问题
- 使用 idHTTP 获取 UTF-8 编码的中文网页 - 回复同学 "Delphi学习者" 的问题
- javascript 跨域POST 使用form表单 获取提交返回内容的方法
- HttpClient POST 的 UTF-8 编码问题
- 使用jQuery.get(url,[data],[callback])不能获取返回的页面XML内容
- PHP CURL POST无法获取响应内容的问题
- Asp.net MVC 3 Razor 视图引擎 中使用@输出的内容都会被自动进行HTML编码 问题的解决办法
- 使用 idHTTP 获取 UTF-8 编码的中文网页
- 使用HttpURLConnection开发自动发送Get、Post请求并获取响应
- 关于读取HttpWebRequest获取的服务器返回流的问题总结
- 引用 Servlet中使用HttpServletResponseWrapper截获返回的页面内容
- 前台页面使用utf-8编码,url中包含中文参数时后台获取参数乱码问题解决
- Sliverlight使用HTTP POST服务器出现的问题,求高手解答
- 使用HttpWebRequest的POST取得网页内容(异步操作)2篇集合