您的位置:首页 > 理论基础 > 计算机网络

解决网络通信中的中文乱码问题(Java)

2015-07-21 23:06 645 查看
编程中,中文就意为着麻烦,特别是网络通信中,可能会遇到中文乱码的问题,想要解决Java中文乱码的问题,首先说一下字符,字符集,编码的概念.

字符:文字与符号的总称,包括文字,图形符号,数学符号等.

字符集:是一组抽象字符的集合,通常和一种具体的语言文字对应,该文字中所有的字符或者大部分常用字符就构成了该文字的字符集,比如英文字符集,繁体字符集,日文字符集等.

字符编码:计算机中处理各种字符,需要将字符和二进制内码对应,当然需要相应的对应关系,这种对应关系就是字符编码.要制定编码首先要确定字符集,并将字符集中的字符排序,然后和二进制数字对应起来.然后根据字符集内的字符的多少,确定需要几个字节进行编码.

我们最熟悉的应该是ASCII码,是目前计算机中用的最广范的字符集及其字符编码.ISO-8859-1可以表示西欧语言,由于它是单字节编码,和计算机的基础单位相同,所以它的用处还是挺多的,很多协议还默认使用ISO-8859-1编码.Unicode编码,学习Java的同学一定不陌生,Java采用的就是Unicode编码,所以Java的一个字符为2个字节,我们最常使用的UTF-8编码就是Unicode编码的实现方式.GB2312,GBK,GB18030都表示中文的字符集.

网络通信产生乱码的原因主要是通信过程中使用的编码方式不同:服务器中的编码方式,传输过程中的编码方式,传输到达客户端的编码方式.因此在传输过程中就需要至少两次编码转换:服务器编码->网络编码->客户端编码.在转换过程中出现任何异常情况都可能引起编码混乱,主要有2种方式解决:

第一种:大部分设备都支持Unicode字符集,所以连接网络时,我们希望网络数据传输时使用UTF-8方式传输,这样就可以简单地将UTF-8转换成Unicode字符集,代码:

InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
byte array[] = new byte[1024];
int current = -1, i  = 0;
while((current = bis.read()) != -1) {
array[i] = (byte)current;
i++;
}
resultData = new String(array, "GB2312");


上面的过程是将网络数据转换为字节,再将字节按照GB2312的方式进行转换.

另一种方式是在数据传递过程中使用ISO-8859-1字符集,这样就是直接使用ASCII编码方式,当然传输到客户端时,需要反转数据,代码:

public static String FormatStr(String str) {
if(str == null || str.equals(""))
return "";
try {
return new String(str.getBytes("ISO-8859-1"), "gbk);
} catch(UnsupportEncodingException e) {
return str;


可以看出,解决中文乱码只需两步:

1.使用getBytes(“编码方式”);对汉字进行重新编码,得到字节数组.

2.使用new String(Bytes[], “解码方式”);对1得到的字节数组进行相应解码.

“`
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息