inputstream流乱码_java处理接收inputstream中传来的中文字,出现某个字乱码问题

1.第一种状况java

服务器和客户端编码不统一形成中文乱码,当服务器返回数据是UTF-8格式时,客户端在读取输入流时,须要将其转换成UTF-8格式,请看客户端部分代码:web

………………..省略部分代码………………

// 设置URL而且打开链接

url = new URL("http://192.168.1.7:8080/exa/zh_cn");

httpurlconnection = (HttpURLConnection) url.openConnection();

//获得输入流并转换为字符串

inputStream = httpurlconnection.getInputStream();

String strResult="";

byte[] b = new byte[1024];

int i = 0;

while ((i = inputStream.read(b)) != -1) {

strResult+=new String(b,"utf-8");

b = new byte[1024];

}

//显示到控件上

textView_1.setText(strResult);

………………省略部分代码………………

代码中关键代码是,new String(b,”utf-8”),将byte数组转换成UTF-8格式的字符串,结果如图10-17所示。json

当改为new String(b,”gb2312”)时获得结果如图10-18所示。数组

如何避免中文乱码问题,首先,不要频繁转码和漫无目的转码,这样转来转去最后本身也不知道转到哪里去了,其次,尽可能使客户端程序的编码和服务器编码统一,再次避免用字节的方式去读取中文和操做中文字符串,由于一个汉字占两个字节,稍不注意开发过程当中就会出现读取一个字节,形成读取了半个字,就会出现乱码。服务器

2.第二种状况app

中文汉字中出现少部分中文乱码。这种现象看起来很怪异,每每在开发过程当中,读者都有可能这样操做了,但没有发现。这种现象是怎么形成的呢?先看例子程序。svg

实例:测试

读取文件的核心代码以下(为了测试多一些的汉字,本例将把不少汉字写在test.txt里放在assets文件夹下):

[java] view plain copythis

………………..省略部分代码………………

inputStream = this.getAssets().open("test.txt");

byte buffer[] = new byte[100];

StringBuffer sb = new StringBuffer();

int i = 0;

while ((i = inputStream.read(buffer)) != -1) {

sb.append(new String(buffer, 0, i));

}

textView_1.setText(sb.toString());

………………..省略部分代码………………

由上述代码产生的效果如图10-19所示。编码

部分乱码的现象出现了,缘由我先不讲,先改动代码再看看效果。把byte buffer[] = new byte[100]改为byte buffer[] = new byte[inputStream.available()],运行后获得的效果如图10-20所示。

思考一下:100和inputStream.available()的区别,就会出现中文部分乱码的问题?缘由是有可能在读取100个字节的时候正好遇到一个汉字的前半个字节,后100个字节的第一位置的字节也是这个字的后半个字节,半个字节是汉字吗?这样固然会出现乱码了。把字节的数组直接设置成输入流的长度,在读取的时候,一次性读取,那么就不会出现所谓的半个字的现象,固然也不会出现乱码的问题了。

还有一个解决办法,就是不以字节的方式读取文件,以字符的方式读取,一个字符装一个汉字是合法的,看一下代码

[java] view plain copy

………………..省略部分代码………………

inputStream = this.getAssets().open("test.txt");

StringBuffer sb = new StringBuffer();

InputStreamReader isr=new InputStreamReader(inputStream);

char buf[] = new char[20];

int nBufLen = isr.read(buf);

while(nBufLen!=-1){

sb.append(new String(buf, 0, nBufLen));

nBufLen = isr.read(buf);

}

textView_1.setText(sb.toString());

………………..省略部分代码………………

以上是网友的例子,看到点后,博主本身解决了问题,哈哈哈哈哈

ps:这是处理完后的方法。

`public static String sendPost(String url, String param) {

DataOutputStream out = null;

BufferedReader reader = null;

StringBuffer result = new StringBuffer(“”);

try {

//建立链接

URL realUrl = new URL(url);

HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();

connection.setDoOutput(true);

connection.setDoInput(true);

connection.setRequestMethod(“POST”);

connection.setUseCaches(false);

connection.setInstanceFollowRedirects(true);

connection.setRequestProperty("Content-Type", "application/json;charset=utf-8");

connection.setRequestProperty("Accept-Charset", "utf-8");

// connection.setConnectTimeout(3000); //3秒链接超时

// connection.setReadTimeout(3000); //3秒读取超时

connection.setRequestProperty(“Charset”,”utf-8”);

connection.connect();

//POST请求

out = new DataOutputStream(connection.getOutputStream());

out.writeBytes(param);

out.flush();

// out.write(param.getBytes());

//读取响应

reader = new BufferedReader(new InputStreamReader(connection.getInputStream(),"utf-8"));

//字符形式读取,避免中文字符出现部分乱码问题

char buf[] = new char[20];

int nBufLen = reader.read(buf);

while(nBufLen!=-1){

result.append(new String(buf, 0, nBufLen));

nBufLen = reader.read(buf);

}

// 断开链接

connection.disconnect();

} catch (UnsupportedEncodingException e) {

System.out.println("Message=="+e.getMessage());

// e.printStackTrace();

} catch (IOException e) {

System.out.println("Message=="+e.getMessage());

//e.printStackTrace();

}

finally {

try {

if (out != null) {

}

if (reader != null) {

reader.close();

}

} catch (IOException ex) {

ex.printStackTrace();

}

}

return result.toString();

}`

你可能感兴趣的:(inputstream流乱码)