要想解决Java中文乱码问题,首先要了解字符,字符集,编码的概念以及经常使用的编码方式。数组
字符:是文字与符号的总称,包括文字,图形符号,数学符号等。服务器
字符集:就是一组抽象字符的集合。字符集经常和一种具体的语言文字对应起来,该文字中的全部字符或者大部分经常使用字符就构成了该文字的字符集,好比英文字符集,繁体字符集,日文字符集等。网络
字符编码:计算机要处理各类字符,就须要将字符和二进制内码对应起来,这种对应关系就是字符编码。要制定编码首先要肯定字符集,并将字符集内的字符排序,而后和二进制数字对应起来。根据字符集内字符的多少,肯定用几个字节来编码。编码
ASCII编码是目前计算机中用得最普遍的字符集及其编码。ISO-8859-1能够表示的是西欧语言,它看起来很简单,为是么还在使用呢?因为是单字节编码,与计算机最基础的表示单位一致,因此不少时候,仍旧使用ISO-8859-1编码来表示,并且在不少协议上默认使用该编码。Unicode编码(统一码,万国码,单一码)是一种在计算机上使用的字符编码,一般咱们所遇到的UTF-8就是Unicode编码的实现方式。Gb2312子集是简体字集;Big5字集是台湾繁体字集;GBK字集是简繁字集,包括了Gb字集,Big5字集和一些符号。Gb18030是国家制定的一个强制性大字集标准,它的推出使汉字集有了统一的标准。Linux系统默认使用的是ISO-8859-1编码,Win32系统默认使用的是Gb2312编码。code
网络通讯中,产生乱码的缘由是主要是通讯过程当中使用了不一样的编码方式:服务器中的编码方式,传输过程当中的编码方式,传输到达终端设备的编码方式。所以在传输过程当中就须要至少两次编码转换:首先从服务器编码转换为网络编码,再从网络编码转换为终端设备编码。在转换过程当中发生任何状况均可能引发编码混乱,通常状况下咱们能够经过如下两种方式来避免这个问题。orm
一种方式是:因为大部分终端设备都支持Unicode字符集,因此在链接网页时,咱们但愿网页数据在网络传输时使用UTF-8方式传输,这样就能够很简单地将UTF-8转换成Unicode字符集了,下面咱们将通讯过程当中获得的流先转换为字节,而后再将字节按Gb2312的方式进行转换获得字符串,代码以下排序
InputStream is = conn.getInputStream();字符串
BufferedInputStream bis = new BufferedInputStream(is);get
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;
}
}
归根结底,解决中文乱码只须要两个步骤:
使用getBytes("编码方式");来对汉字进行重编码,获得它的字节数组。
在使用new String(Bytes[], "编码方式");来对字节数组进行相应的解码。
只要理解了编码和解码的含义,并掌握了何时应该编码,何时应该解码,怎么编码及怎么解码,就再也不惧怕中文乱码问题了。