在做一个app,需要数据源,就去网上抓取,在展示时方向总是有个别汉字是乱码,抓狂
在网上找的的解决方案五花八门
方案一:在网络请求时设置请求头信息,告诉服务器要请求的编码
方案二:new String(str.getBytes(“encode”), “encode”);
方案三:设置IDE的编码方式
只能说,通通pass,我要请求的编码没错,是utf-8,开发工具的编码也是utf-8,那么为什么会乱码呢
原因
在我们得到一个页面的数据流并读取它时,通常会创建一个缓冲,如byte[] buff = new byte[1024]。
那么问题来了,一个汉字是占用两个字节,这就有可能会造成一个汉字会被分成两次读取,这样这个汉字在转为字符串是自然也就不能正确解码了。
解决方案
既然汉字占两个字节,那么我们就两个字节两个字节的读取呗,把读取时的字节流转为字符流,缓冲也由字节缓冲换为字符缓冲,OK,搞定!
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
InputStream in = conn.getInputStream();
InputStreamReader ir = new InputStreamReader(in); //字节流转字符流
char[] buff = new char[1024];
int len = -1;
StringBuffer sb = new StringBuffer();
while((len = ir.read(buff)) != -1){
sb.append(buff, 0, len);
}
in.close();
ir.close();