网络通信的中文乱码问题及解决方法
2013-07-12 10:29
543 查看
要想解决Java中文乱码问题,首先需要了解字符、字符集、图形符号、数学符号等以及常用的编码方式。
1. 字符,是文字和符号的总称,包括文字、图形符号、数学符号等。
2. 字符集,是一组抽象字符的集合。字符集常常和一种具体的语言文字对应起来,该文字中的所有字符或大部分常用字符就构成了该文字的字符集,比如英文字符集、繁体汉字字符集、日文字符集等。
3. 字符编码,计算机要处理各种字符,就需要将字符和二进制内码对应起来,这种对应关系就是字符编码。要制定编码首先要确定字符集,并将字符集内的字符排序,然后和二进制数字对应起来。根据字符集内字符的多少,确定用几个字节来编码。
ASCII 编码是目前计算机中用得最广泛的字符集及其编码。
ISO-8859-1 可以表示的是西欧语言,它看起来很单一,但是它是单字节编码与计算机最基础的表示单位一致,所以很多时候仍旧在使用,而且很多协议上默认使用该编码。
Unicode 编码(统一码、万国码、单一码),通常我们所遇到的utf-8 编码就是Unicode 编码的实现方式。
GB2312 表示简体中文字符集。
BIG5 表示台湾繁体字符集。
GBK 表示简体繁体字符集,包括GB2312字符集、BIG5 字符集和一些符号。
GB18030 是一个强制性大字集标准,它的推出使汉字集有了统一的标准。
Linux 默认使用ISO-8859-1编码。
Win32 默认使用GB2312编码。
网络通信中,产生乱码的原因主要是通信过程(Server端、传输过程、Client端)中使用了不同的编码方式。因此在通信过程中需要至少两次编码转换:Server端编码转换网络编码、网络编码转换为Client编码。在转换过程中发生任何情况都有可能引起乱码。一般情况,我们通过以下两种方式来避免乱码问题。
1. 先将流数据转换为字节数组,再将字节数组以gb2312编码创建字符串。
示例代码:
BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
byte buffer[] = new byte[1024];
for(int i=0; (current = bis.read()) != –1 && i < buffer.length; i++) {
buffer[i] = (byte)current;
}
String data = new String(buffer, “gb2312”);
2. 先(编码)使用getBytes(String code)将字符串转换为字节数组,再(解码)使用String(byte[] buffer, String encode)转换字符串。
示例代码:
public static String formatStr(String str) {
if(!TextUtils.isEmpty(str)) {
try {
str = new String(str.getBytes(“ISO-8859-1”), “GBK”);
} catch(UnsupportedEncodingException ex) { }
} // if
return str;
}
1. 字符,是文字和符号的总称,包括文字、图形符号、数学符号等。
2. 字符集,是一组抽象字符的集合。字符集常常和一种具体的语言文字对应起来,该文字中的所有字符或大部分常用字符就构成了该文字的字符集,比如英文字符集、繁体汉字字符集、日文字符集等。
3. 字符编码,计算机要处理各种字符,就需要将字符和二进制内码对应起来,这种对应关系就是字符编码。要制定编码首先要确定字符集,并将字符集内的字符排序,然后和二进制数字对应起来。根据字符集内字符的多少,确定用几个字节来编码。
ASCII 编码是目前计算机中用得最广泛的字符集及其编码。
ISO-8859-1 可以表示的是西欧语言,它看起来很单一,但是它是单字节编码与计算机最基础的表示单位一致,所以很多时候仍旧在使用,而且很多协议上默认使用该编码。
Unicode 编码(统一码、万国码、单一码),通常我们所遇到的utf-8 编码就是Unicode 编码的实现方式。
GB2312 表示简体中文字符集。
BIG5 表示台湾繁体字符集。
GBK 表示简体繁体字符集,包括GB2312字符集、BIG5 字符集和一些符号。
GB18030 是一个强制性大字集标准,它的推出使汉字集有了统一的标准。
Linux 默认使用ISO-8859-1编码。
Win32 默认使用GB2312编码。
网络通信中,产生乱码的原因主要是通信过程(Server端、传输过程、Client端)中使用了不同的编码方式。因此在通信过程中需要至少两次编码转换:Server端编码转换网络编码、网络编码转换为Client编码。在转换过程中发生任何情况都有可能引起乱码。一般情况,我们通过以下两种方式来避免乱码问题。
1. 先将流数据转换为字节数组,再将字节数组以gb2312编码创建字符串。
示例代码:
BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
byte buffer[] = new byte[1024];
for(int i=0; (current = bis.read()) != –1 && i < buffer.length; i++) {
buffer[i] = (byte)current;
}
String data = new String(buffer, “gb2312”);
2. 先(编码)使用getBytes(String code)将字符串转换为字节数组,再(解码)使用String(byte[] buffer, String encode)转换字符串。
示例代码:
public static String formatStr(String str) {
if(!TextUtils.isEmpty(str)) {
try {
str = new String(str.getBytes(“ISO-8859-1”), “GBK”);
} catch(UnsupportedEncodingException ex) { }
} // if
return str;
}
相关文章推荐
- Android 与 PC网络通信之中文乱码问题解决
- 解决网络通信中的中文乱码问题(Java)
- 今天在网络上找到了一个比较好的解决Rhythmbox中文乱码的问题的方法
- 网络请求数据回来中文乱码问题解决方法
- Android 与 PC网络通信之中文乱码问题解决
- Python实现的json文件读取及中文乱码显示问题解决方法
- Cacti(RRDTOOL)中文乱码以及统计图乱码问题解决方法
- Tomcat中文乱码问题的原理和解决方法
- Python BeautifulSoup中文乱码问题的2种解决方法
- Windows下CMD中文乱码问题解决方法
- JBPM4.4GPD设计器中文乱码问题的另一种解决方法
- CCS5.2 中文显示乱码问题解决方法
- 【java 中解决中文乱码问题的方法】
- 升级tomcat后出现的页面录入框中文乱码问题解决方法
- Mysql 导入导出csv 中文乱码问题的解决方法
- Spring mvc 中文乱码问题解决方法
- jenkins控制台输出中文乱码问题解决方法
- MySQL字符集中文乱码终极解决方案和mysql查询中文问题解决方法[转贴]
- jsp中 ajax的get请求的中文乱码问题的解决方法
- Tomcat+Springmvc中文乱码问题解决方法