网络通信中的乱码问题

要想解决Java中文乱码问题,首先要了解字符,字符集,编码的概念以及常用的编码方式。

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

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

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

ASCII编码是目前计算机中用得最广泛的字符集及其编码。ISO-8859-1可以表示的是西欧语言,它看起来很简单,为是么还在使用呢?由于是单字节编码,与计算机最基础的表示单位一致,所以很多时候,仍旧使用ISO-8859-1编码来表示,而且在很多协议上默认使用该编码。Unicode编码(统一码,万国码,单一码)是一种在计算机上使用的字符编码,通常我们所遇到的UTF-8就是Unicode编码的实现方式。Gb2312子集是简体字集;Big5字集是台湾繁体字集;GBK字集是简繁字集,包括了Gb字集,Big5字集和一些符号。Gb18030是国家制定的一个强制性大字集标准,它的推出使汉字集有了统一的标准。Linux系统默认使用的是ISO-8859-1编码,Win32系统默认使用的是Gb2312编码。

网络通信中,产生乱码的原因是主要是通信过程中使用了不同的编码方式:服务器中的编码方式,传输过程中的编码方式,传输到达终端设备的编码方式。因此在传输过程中就需要至少两次编码转换:首先从服务器编码转换为网络编码,再从网络编码转换为终端设备编码。在转换过程中发生任何情况都可能引起编码混乱,一般情况下我们可以通过以下两种方式来避免这个问题。

一种方式是:由于大部分终端设备都支持Unicode字符集,所以在连接网页时,我们希望网页数据在网络传输时使用UTF-8方式传输,这样就可以很简单地将UTF-8转换成Unicode字符集了,下面我们将通信过程中得到的流先转换为字节,然后再将字节按Gb2312的方式进行转换得到字符串,代码如下

InputStream is = conn.getInputStream();

BufferedInputStream bis = new BufferedInputStream(is);

byte bytearray[] = new byte[1024];

int current = -1;

int i = 0;

while((current = bis.read()) != -1){

    bytearray[i] = (byte)current;

    i++;

}

resultData = new String(bytearray, "GB2312");

因此,通过上面的转换,“resultData”字符串便可以显示中文效果了。

另一种方式是在数据传递过程中使用ISO-8859-1字符集,这样就是直接使用ASCII编码方式,当然在传递到终端设备时,需要将其数据反转才能够正常显示。下面我们将一个字符串按ISO-8859-1字符集进行转换,代码如下:

public static String FormatStr(String str){

        if(str == null || str.length() == 0){

        return "";

    }

    try{

        return new String(str.getBytes("ISO-8859-1"), "bgk");

    }catch(UnsupportedEncodingException ex){

        return str;

    }

}

归根结底,解决中文乱码只需要两个步骤:

  1. 使用getBytes("编码方式");来对汉字进行重编码,得到它的字节数组。

  2. 在使用new String(Bytes[], "编码方式");来对字节数组进行相应的解码。

    只要理解了编码和解码的含义,并掌握了什么时候应该编码,什么时候应该解码,怎么编码及怎么解码,就不再害怕中文乱码问题了。

你可能感兴趣的:(网络通信中的乱码问题)