Android 从网络中获取数据时 产生部分数据乱码的解决

释放双眼,带上耳机,听听看~!

问题描述:从网络中抓取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();
}

问题解决。

 

 

人已赞赏
Android文章

Android 导入第三方jar时 出现ClassNotFoundException

2020-4-25 18:01:48

Android文章

Android Splash界面支持用户点击 直接进入主界面

2020-4-25 19:16:59

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索