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

网络通信的中文乱码问题及解决方法

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;

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