为什么如下方法把inputstream转为String的时候会出错?本帖最后由 AA5279AA 于 2013-09-03 11:49:09 编辑pu
为什么如下方法把inputstream转为String的时候会出错?
本帖最后由 AA5279AA 于 2013-09-03 11:49:09 编辑
public String getWeatherJson(InputStream is) {
StringBuilder builder = new StringBuilder();
InputStream is = null;
try {
byte[] b = new byte[2048];
for (int n; (n = is.read(b)) != -1;) {
builder.append(new String(b, 0, n, "UTF-8"));
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return builder.toString();
}
is本来应该的输出为:
{"weatherinfo":{"city":"门头沟","city_en":"mentougou","date_y":"2013年9月3日","date":"","week":"星期二","fchh":"11","cityid":"101011400","temp1":"27C~18C","temp2":"22C~17C","temp3":"23C~17C","temp4":"29C~16C","temp5":"29C~17C","temp6":"28C~17C","tempF1":"80.6F~64.4F","tempF2":"71.6F~62.6F","tempF3":"73.4F~62.6F","tempF4":"84.2F~60.8F","tempF5":"84.2F~62.6F","tempF6":"82.4F~62.6F","weather1":"阵雨","weather2":"中雨转小雨","weather3":"小雨转多云","weather4":"晴","weather5":"晴","weather6":"晴转多云","img1":"3","img2":"99","img3":"8","img4":"7","img5":"7","img6":"1","img7":"0","img8":"99","img9":"0","img10":"99","img11":"0","img12":"1","img_single":"3","img_title1":"阵雨","img_title2":"阵雨","img_title3":"中雨","img_title4":"小雨","img_title5":"小雨","img_title6":"多云","img_title7":"晴","img_title8":"晴","img_title9":"晴","img_title10":"晴","img_title11":"晴","img_title12":"多云","img_title_single":"阵雨","wind1":"微风","wind2":"微风","wind3":"微风","wind4":"微风","wind5":"微风","wind6":"微风","fx1":"微风","fx2":"微风","fl1":"小于3级","fl2":"小于3级","fl3":"小于3级","fl4":"小于3级","fl5":"小于3级","fl6":"小于3级","index":"热","index_d":"天气热,建议着短裙、短裤、短薄外套、T恤等夏季服装。","index48":"较舒适","index48_d":"建议着薄外套、开衫牛仔衫裤等服装。年老体弱者应适当添加衣物,宜着夹克衫、薄毛衣等。","index_uv":"弱","index48_uv":"最弱","index_xc":"不宜","index_tr":"适宜","index_co":"较舒适","st1":"25","st2":"16","st3":"18","st4":"15","st5":"21","st6":"17","index_cl":"较不宜","index_ls":"不太适宜","index_ag":"易发"}}
但是实际上的输出是存在乱码,但是只是一两个字符乱码。
这个例子中乱码的部分是
,"wind1":"微风",中的“微”字无法正常显示。
但是通过上述方法如果复制文件的话正常。。
后来改成了如下方法:
public static String fromIputStreamToString(InputStream is){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int i = -1;
try {
while ((i = is.read()) != -1) {
baos.write(i);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return baos.toString();
}
显示正常。。。
问:为什么第一个方法会出现个别字符乱码?
[解决办法]第一次:is.read(b)
第二次:is.read()
这个应该是根源,个人感觉第一次正好读到了半个中文字,而第二次是逐个字节读
[解决办法]用InputStreamReader吧,使用InputStream读取2048位有很大可能末字未读取到完整的编码,从而使用其构造字符串时导致错误编码.
文字读取可以使用InputStreamReader(inputStream, "UTF-8")来操作
[解决办法]同意一楼,
读取“微”时打印的byte数组值,转为utf-8编码时,解析失败,出现乱码。
要么换一个编码如GBK,要么就用第二个方法。
inputstream 转byte数组时,用的是什么编码格式,求解?
[解决办法]一次读取2048个字节会造成中文字符的截断。第一个字节和最后一个字节都有可能是不完整的。
[解决办法]这样读一定是会出错的额!在每次2048个字节读完以后你不能保证这些字节就是刚刚好几个中文字符可能把后面一个中文字符给拆开来了,这样在用new String(b, 0, n, "UTF-8")转成string就会出现乱码了。后面一个是把所有的字节都读完了在同一装换就不会出现字符被拆的现象