错误的读取方式:
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();
}
正确的读取方式:
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) {
e.printStackTrace();
}
return
baos.toString();
}
第一次:is.read(b)
第二次:is.read()
这个应该是根源,个人感觉第一次正好读到了半个中文字,而第二次是逐个字节读
用InputStreamReader吧,使用InputStream读取2048位有很大可能末字未读取到完整的编码,从而使用其构造字符串时导致错误编码.
文字读取可以使用InputStreamReader(inputStream, "UTF-8")来操作
读取“微”时打印的byte数组值,转为utf-8编码时,解析失败,出现乱码。一次读取2048个字节会造成中文字符的截断。第一个字节和最后一个字节都有可能是不完整的。
要么换一个编码如GBK,要么就用第二个方法。
一次读取2048个字节会造成中文字符的截断。第一个字节和最后一个字节都有可能是不完整的。
这样读一定是会出错的额!在每次2048个字节读完以后你不能保证这些字节就是刚刚好几个中文字符可能把后面一个中文字符给拆开来了,这样在用new String(b, 0, n, "UTF-8")转成string就会出现乱码了。后面一个是把所有的字节都读完了在同一装换就不会出现字符被拆的现象