黑马程序员_字符编码与解码讲解

字符编码与解码讲解

1. 字符编码和解码

在Java中,字符编码指的是:将字符串转换成字节数组,转换的方法是通过方法getByte()实现的,该方法可以指定编码表,也可以不指定,不指定编码表则使用默认的编码表。下面,我们将通过字符编码和解码,解决如何给字符编码以及解码。

1.1 字符编码

下面的例子,将中文字符进行编码,并指定编码表。控制台的输出结果为:

-60, -29, -70, -61,
-28, -67, -96, -27, -91, -67,
从输出结可以知道,GBK编码的中文字符,一个字符占两个字节。UTF-8编码的中文字符,一个字符占3个字节。


package com.itheima.entranceExam.blog;  
  
import java.io.IOException;  
  
public class encodeTest {  
    public static void main(String[] args) throws IOException {  
  
        String s = "你好";  
        //编码:将字符串变成字节数组,指定编码表为GBK  
        byte[] b1 = s.getBytes("GBK");    
        byte[] b2 = s.getBytes("UTF-8");  
        //遍历字节数组中的元素  
        for(byte b : b1) {  
            System.out.print(b+", ");  
        }  
        System.out.println();  
        //遍历字节数组中的元素  
        for(byte b : b2) {  
            System.out.print(b+", ");  
        }  
    }  
} 

1.2 解码

下面我们对1.1节中编码的中文字符进行解码,解码就是将字符转成的字节数组,从新转换成原来的字符。解码时可以指定编码表也可以不指定,不指定编码表则使用默认是编码表。


    package com.itheima.entranceExam.blog;  
      
    import java.io.IOException;  
      
    public class encodeTest {  
        public static void main(String[] args) throws IOException {  
      
            String s1 = "你好";  
            //编码,指定编码表为GBK  
            byte[] b1 = s1.getBytes("GBK");  
            //解码,指定编码表为GBK  
            String s2 = new String(b1, "GBK");  
            System.out.println(s2);//输出"你好",没有乱码  
        }  
    }  

1.3 编码表不一致导致的问题

注意:当我们编码使用的编码表和解码使用的编码表不一致时,则会出现乱码。下面的例子编码时使用的编码表是UTF-8,而解码使用到编码表是GBK。将字符串"你好"使用UTF-8进行编码,解码时使用GBK,为什么输出结果是三个中文字符"浣犲ソ"?下面我们通过图片来分析:UTF-8编码中文字符串"你好",这两个中文字符串变成6个字节的字节数组。解码时使用GBK编码表,GBK编码表将字节数组中的,每两个联系的字节数组变成一个中文字符,长度为6的字节数组就变成3个中文字符,所以下面例子的2个中文字符解码后,会出现3个中文字符。



package com.itheima.entranceExam.blog;  
  
import java.io.IOException;  
  
public class encodeTest {  
    public static void main(String[] args) throws IOException {  
  
        String s1 = "你好";  
        //编码,指定编码表为UTF-8  
        byte[] b1 = s1.getBytes("UTF-8");  
        //解码,指定编码表为GBK  
        String s2 = new String(b1, "GBK");  
        System.out.println(s2);//输出"浣犲ソ"  
    }  
} 

1.4 解决乱码问题

当编码和解码使用的编码表不一致时,会出现乱码,出现乱码该如何解决呢?

下面的例子演示:编码时使用GBK编码表,解码时使用ISO8859-1编码表,致使出现乱码,如何解决乱码吗?

下面结合图片进行说明(代码也在下面):

出现乱码的应用是,GBK编码表中一个中文字符对应两个字节数组数据,ISO8859-1是拉丁码表和欧洲码表,ISO8859-1编码表一个二进制的字节数组数据对应一个字符。所以两个中文字符GBK编码后,再使用ISO8859-1解码时会出现4个字符的乱码。解决该乱码的步骤是:

1. 将ISO8859-1解码后返回的字符串进行ISO8859-1编码,编码后返回字节数组。

2. 将上面的字节数组进行GBK解码,就能获得原来的中文字符了。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值