因为字符编码的问题,害我折腾了两个小时。以下是代码,大家看一下就明白了。

String url = "http://www.google.com/ig/api?weather=,,,31174165,121433841"; DefaultHttpClient client = new DefaultHttpClient(); HttpUriRequest req = new HttpGet(url); HttpResponse resp = client.execute(req); HttpEntity ent = resp.getEntity(); int status = resp.getStatusLine().getStatusCode(); if(L.Debug) { L.d("" + status); } // 若状态码为 200 ,则表示OK if (status == HttpStatus.SC_OK) { //String result = EntityUtils.toString(ent); if(L.Debug) { //L.d(result); } InputStream stream = ent.getContent(); BufferedReader br = new BufferedReader(new InputStreamReader(stream, "utf-8")); DocumentBuilder b = DocumentBuilderFactory.newInstance() .newDocumentBuilder(); String xmlString = ""; for(String temp = br.readLine(); temp != null;xmlString += temp ,temp = br.readLine()); // 去除字符串中的换行符,制表符,回车符。 xmlString = xmlString.replaceAll("/n|/t|/r", ""); InputStream stream2 = new ByteArrayInputStream(xmlString.getBytes()); Document d = b.parse(new InputSource(stream2)); NodeList n = d.getElementsByTagName("forecast_conditions"); String tips = ""; tips += n.item(0).getChildNodes().item(0).getAttributes() .item(0).getNodeValue(); if(L.Debug) { L.d("" + tips ); L.d("" + n.item(0).getChildNodes().getLength()); //L.Toast(tips, this); } br.close(); stream.close(); stream2.close(); }

关键是这一行代码

BufferedReader br = new BufferedReader(new InputStreamReader(stream, "utf-8"));

将接收的流放入buffer里,处理成utf-8的编码(如果还是乱码,那请改为gb2312或者gbk)

方法二

String url = "http://www.google.com/ig/api?weather=,,,31174165,121433841"; DefaultHttpClient client = new DefaultHttpClient(); HttpUriRequest req = new HttpGet(url); HttpResponse resp = client.execute(req); HttpEntity ent = resp.getEntity(); int status = resp.getStatusLine().getStatusCode(); // If the status is equal to 200 ,that is OK if (status == HttpStatus.SC_OK) { String result = EntityUtils.toString(ent); if(L.Debug) { L.testCharset(result); } // Encode utf-8 to iso-8859-1 result = new String(result.getBytes("ISO-8859-1"), "UTF-8"); DocumentBuilder b = DocumentBuilderFactory.newInstance() .newDocumentBuilder(); String xmlString = result; // Remove the newline,tabs and return characters from string xmlString = xmlString.replaceAll("/n|/t|/r", ""); InputStream stream = new ByteArrayInputStream(xmlString.getBytes()); Document d = b.parse(new InputSource(stream)); getWeatherBean(d); stream.close(); }

// 以下是测试字符编码的 public static void testCharset(String datastr){ try { String temp = new String(datastr.getBytes(), "GBK"); Log.v("TestCharset","****** getBytes() -> GBK ******/n"+temp); temp = new String(datastr.getBytes("GBK"), "UTF-8"); Log.v("TestCharset","****** GBK -> UTF-8 *******/n"+temp); temp = new String(datastr.getBytes("GBK"), "ISO-8859-1"); Log.v("TestCharset","****** GBK -> ISO-8859-1 *******/n"+temp); temp = new String(datastr.getBytes("ISO-8859-1"), "UTF-8"); Log.v("TestCharset","****** ISO-8859-1 -> UTF-8 *******/n"+temp); temp = new String(datastr.getBytes("ISO-8859-1"), "GBK"); Log.v("TestCharset","****** ISO-8859-1 -> GBK *******/n"+temp); temp = new String(datastr.getBytes("UTF-8"), "GBK"); Log.v("TestCharset","****** UTF-8 -> GBK *******/n"+temp); temp = new String(datastr.getBytes("UTF-8"), "ISO-8859-1"); Log.v("TestCharset","****** UTF-8 -> ISO-8859-1 *******/n"+temp); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } }

先用testCharset这个方法,测试哪一种编码没有出现乱码,再修改result = new String(result.getBytes("ISO-8859-1"), "UTF-8");里面对应的编码。

更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. 分支和循环(二)(零基础学习C语言)
  3. Android之反编译APK文件,查看源代码
  4. Android(安卓)10动态申请读写权限
  5. android 呼叫已存在activity
  6. Android在启动adb时失败解决方案
  7. SwipeRefreshLayout在onCreate使用setRefreshing(true)无效
  8. 如何使用ProgressBar动态设置进度条渐变
  9. Android几行代码解决键盘遮挡问题

随机推荐

  1. Iphone,Imac,Win7,Android的日历同步
  2. 笔记77-listview属性介绍
  3. 转载:Android service 实现过程
  4. Tiny4412_android5.0.2编译
  5. Android Java和JavaScript代码相互调用
  6. android中使用Intent在activity之间传递
  7. android中各种permissiond详解
  8. Android Studio SVN 使用方法
  9. Android(安卓)命令行打包和签名
  10. android EditView ime