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

本文介绍了Java中出现中文乱码的问题及解决方案。首先解释了字符、字符集、编码的概念,如ASCII、ISO-8859-1、Unicode等。然后分析了乱码产生的原因,最后提供了两种解决乱码的方法。

要想解决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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值