解决网络通信中的中文乱码问题(Java)

编程中,中文就意为着麻烦,特别是网络通信中,可能会遇到中文乱码的问题,想要解决Java中文乱码的问题,首先说一下字符,字符集,编码的概念.

字符:文字与符号的总称,包括文字,图形符号,数学符号等.
字符集:是一组抽象字符的集合,通常和一种具体的语言文字对应,该文字中所有的字符或者大部分常用字符就构成了该文字的字符集,比如英文字符集,繁体字符集,日文字符集等.
字符编码:计算机中处理各种字符,需要将字符和二进制内码对应,当然需要相应的对应关系,这种对应关系就是字符编码.要制定编码首先要确定字符集,并将字符集中的字符排序,然后和二进制数字对应起来.然后根据字符集内的字符的多少,确定需要几个字节进行编码.

我们最熟悉的应该是ASCII码,是目前计算机中用的最广范的字符集及其字符编码.ISO-8859-1可以表示西欧语言,由于它是单字节编码,和计算机的基础单位相同,所以它的用处还是挺多的,很多协议还默认使用ISO-8859-1编码.Unicode编码,学习Java的同学一定不陌生,Java采用的就是Unicode编码,所以Java的一个字符为2个字节,我们最常使用的UTF-8编码就是Unicode编码的实现方式.GB2312,GBK,GB18030都表示中文的字符集.

网络通信产生乱码的原因主要是通信过程中使用的编码方式不同:服务器中的编码方式,传输过程中的编码方式,传输到达客户端的编码方式.因此在传输过程中就需要至少两次编码转换:服务器编码->网络编码->客户端编码.在转换过程中出现任何异常情况都可能引起编码混乱,主要有2种方式解决:
第一种:大部分设备都支持Unicode字符集,所以连接网络时,我们希望网络数据传输时使用UTF-8方式传输,这样就可以简单地将UTF-8转换成Unicode字符集,代码:

InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
byte array[] = new byte[1024];
int current = -1, i  = 0;
while((current = bis.read()) != -1) {
    array[i] = (byte)current;
    i++;
}
resultData = new String(array, "GB2312");

上面的过程是将网络数据转换为字节,再将字节按照GB2312的方式进行转换.

另一种方式是在数据传递过程中使用ISO-8859-1字符集,这样就是直接使用ASCII编码方式,当然传输到客户端时,需要反转数据,代码:

public static String FormatStr(String str) {
    if(str == null || str.equals("")) 
        return "";
    try {
        return new String(str.getBytes("ISO-8859-1"), "gbk);
    } catch(UnsupportEncodingException e) {
        return str;

可以看出,解决中文乱码只需两步:
1.使用getBytes(“编码方式”);对汉字进行重新编码,得到字节数组.
2.使用new String(Bytes[], “解码方式”);对1得到的字节数组进行相应解码.
“`

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值