zoukankan      html  css  js  c++  java
  • Android 从网络中获取数据时 产生部分数据乱码的解决

    转载请表明出处:http://blog.csdn.net/lmj623565791/article/details/23562939

    问题描述:从网络中抓取html页面进行解析,解析后发现产生部分中文乱码。

    由来:制作csdn客户端时产生 , http://blog.csdn.net/lmj623565791/article/details/23532797  (java环境下,使用控制台打印出是没有乱码)


    于是立马检查从服务器读取的代码:

    	/**
    	 * 返回该链接地址的html数据
    	 * 
    	 * @param urlStr
    	 * @return
    	 * @throws CommonException
    	 */
    	public static String doGet(String urlStr) throws CommonException
    	{
    		StringBuffer sb = new StringBuffer();
    		try
    		{
    			URL url = new URL(urlStr);
    			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    			conn.setRequestMethod("GET");
    			conn.setConnectTimeout(5000);
    			conn.setDoInput(true);
    			conn.setDoOutput(true);
    
    			if (conn.getResponseCode() == 200)
    			{
    				InputStream is = conn.getInputStream();
    				int len = 0;
    				byte[] buf = new byte[1024];
    
    				while ((len = is.read(buf)) != -1)
    				{
    					sb.append(new String(buf, 0, len, "UTF-8"));
    				}
    
    				is.close();
    			} else
    			{
    				throw new CommonException("访问网络失败!");
    			}
    
    		} catch (Exception e)
    		{
    			throw new CommonException("访问网络失败!");
    		}
    		return sb.toString();
    	}
    

    发现可能是由于我采用字节流从网络读取数据,且每次读取1024个字节,读取完成后能后强制转化为字符串,又因为使用编码为UTF-8,UTF-8是一种变长码(英文1个字节,中文两个字节),所以1024可能会造成刚好截取了某个汉字的一半(前一个字节),然后转化为字符串时造成乱码。唯一不理解的在java环境下,使用控制台打印出是没有乱码的。如果你有不同的理解欢迎留言探讨。

    于是把读取数据的代码从字节流改成字符流,修改后的代码为:

    	/**
    	 * 返回该链接地址的html数据
    	 * 
    	 * @param urlStr
    	 * @return
    	 * @throws CommonException
    	 */
    	public static String doGet(String urlStr) throws CommonException
    	{
    		StringBuffer sb = new StringBuffer();
    		try
    		{
    			URL url = new URL(urlStr);
    			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    			conn.setRequestMethod("GET");
    			conn.setConnectTimeout(5000);
    			conn.setDoInput(true);
    			conn.setDoOutput(true);
    
    			if (conn.getResponseCode() == 200)
    			{
    				InputStream is = conn.getInputStream();
    				InputStreamReader isr = new InputStreamReader(is,"UTF-8");
    				int len = 0;
    				char[] buf = new char[1024];
    
    				while ((len = isr.read(buf)) != -1)
    				{
    					sb.append(new String(buf, 0, len));
    				}
    
    				is.close();
    				isr.close();
    			} else
    			{
    				throw new CommonException("访问网络失败!");
    			}
    
    		} catch (Exception e)
    		{
    			throw new CommonException("访问网络失败!");
    		}
    		return sb.toString();
    	}
    
    问题解决。





  • 相关阅读:
    河北金力集团公文流转系统
    输出《Harry Potter and the Sorcerer's Stone》英文i的字母数量并排序
    四则运算自动出题系统
    输出《Harry Potter and the Sorcerer's Stone》文本中的前N个最长用的英文单词及其数量
    《程序员的修炼之道从小工到专家》第二章阅读有感
    异常处理动手动脑
    poj 1860
    poj 2182
    poj 2253
    poj 2001
  • 原文地址:https://www.cnblogs.com/oversea201405/p/3752043.html
Copyright © 2011-2022 走看看