JAVA—编码问题


 

 

一、编码。(引用  百度百科

  编码是信息从一种形式或格式转换为另一种形式的过程也称为计算机编程语言的代码简称编码。用预先规定的方法将文字、数字或其它对象编成数码,或将信息、数据转换成规定的电脉冲信号。编码在电子计算机电视、遥控和通讯等方面广泛使用。编码是信息从一种形式或格式转换为另一种形式的过程。解码,是编码的逆过程。

 

二、程序中编码不一致。

   程序中  IO读取 文件,如果编码不一致,就会造成乱码的情况,

  执行以下代码  不同编码 , 输出的结果就会出现乱码情况。

 

  

        String a="未知的路上ABC";
        byte[] bytea=a.getBytes("utf-8");

        System.out.println("编码一致,输出结果");
        String a1=new String(bytea);
        System.out.println(a1);
       

        System.out.println("编码不一致,输出结果");
        String a2=new String(bytea,"utf-16be");
        System.out.println(a2);

 

    输出结果为:

    

 

三、不同编码 在内存中占用的字节。

 

  1、gbk编码。

    

        String s="未知ABC";
        //gbk编码  中文占用两个字节,英文占用一个字节
        byte[] bytes1=s.getBytes("gbk");
        for (byte b:bytes1){
            System.out.print(Integer.toHexString(b&0xff)+" ");
        }

  最后输出结果为:ce b4 d6 aa 41 42 43 

  可以看出 gbk编码下, 中文占用两个 字节,英文占用一个字节。

 

  2、utf-8编码。

        //utf-8编码  中文占用3个字节,英文占用一个字节
        byte[] bytes2=s.getBytes("utf-8");
        for (byte b:bytes2){
            System.out.print(Integer.toHexString(b&0xff)+" ");
        }

  最后输出结果为:e6 9c aa e7 9f a5 41 42 43 

  可以看出 utf-8编码下, 中文占用三个 字节,英文占用一个字节。

 

  3、utf-16be 编码

        //utf-16be 编码 中文只能用2个字节,英文占用2 个字节
        byte[] bytes3=s.getBytes("utf-16be");
        for (byte b:bytes3){
            System.out.print(Integer.toHexString(b&0xff)+" ");
        }

  最后输出结果为:67 2a 77 e5 0 41 0 42 0 43 

  可以看出 utf-16be 编码下, 中文占用两个 字节,英文占用两个字节。

  

 

 

四、总结。

  

  1、当你的字节序列式某种编码时,这个时候想把字节序列变成字符串。也需要用这种编码方式,否则会出现乱码。

  2、文本文件,就是字节序列,可以是任意编码的字节序列,如果我们在中文机器上创建文件,那么该文本则只认识ansi编码。

  


作者:未知的路上,发布于:2018/11/24
原文:https://www.cnblogs.com/zyhbook/p/10012014.html