• IO流:java中解码和编码出现乱码说明及代码实现


    一、UTF-8和GBK编码方式

    • 如果采用的是UTF-8的编码方式,那么1个英文字母 占 1个字节,1个中文占3个字节
    • 如果采用GBK的编码方式,那么1个英文字母 占 1个字节,1个中文占2个字节

    二、idea和eclipse的默认编码方式

    其实idea和eclipse的默认编码方式是不一样的哦。
    idea默认的编码方式是:UTF-8
    在这里插入图片描述
    eclipse默认采用的编码方式是GBK

    三、解码和编码方法

    1、java中编码的方法

    • public byte[] getBytes() 使用默认的编码方式进行编码
    • public byte[] getBytes(Charset charset) 使用指定方式进行编码

    2、java中解码的方法

    • public String(byte bytes[]) 使用默认的方式进行解码
    • public String(byte bytes[], String charsetName) 使用指的方式进行解码

    四、代码实现

    以下代码demo均采用idea开发哦

    编码

    1、使用默认的编码方式进行编码
    看下面这段代码,请猜一猜数组中的元素有几个?

    package com.heima.demo;
    
    import java.util.Arrays;
    
    public class TestDemo {
        public static void main(String[] args) {
            String str = "dk你好";
            byte[] bytes = str.getBytes();
            System.out.println(Arrays.toString(bytes));
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    你答对了吗?数组中一共有8个元素,因为idea默认采用的编码方式是utf-8,如果采用的是UTF-8的编码方式,那么1个英文字母 占 1个字节,1个中文占3个字节。我们看一下运行结果

    [100, 107, -28, -67, -96, -27, -91, -67]
    
    Process finished with exit code 0
    
    
    • 1
    • 2
    • 3
    • 4

    如果使用指定的编码方式GBK进行编码呢?我们看一下代码

    public class TestDemo {
        public static void main(String[] args) throws UnsupportedEncodingException {
            String str = "dk你好";
            byte[] bytes = str.getBytes("gbk");
            System.out.println(Arrays.toString(bytes));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    答案是:数组元素一共有6个,因为采用的是GBK编码方式,那么1个英文字母 占 1个字节,1个中文占2个字节。
    我们看一下运行结果

    [100, 107, -60, -29, -70, -61]
    
    Process finished with exit code 0
    
    • 1
    • 2
    • 3

    解码

    1、使用默认的方式进行解码

    package com.heima.demo;
    
    import java.io.UnsupportedEncodingException;
    
    public class TestDemo {
        public static void main(String[] args) throws UnsupportedEncodingException {
            String str = "dk你好";
            byte[] byte1 = str.getBytes();
            String res1 = new String(byte1);
            System.out.println(res1);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    运行结果如下:

    dk你好
    
    Process finished with exit code 0
    
    • 1
    • 2
    • 3

    如果给他加上指定编码方式呢?

    package com.heima.demo;
    
    import java.io.UnsupportedEncodingException;
    
    public class TestDemo {
        public static void main(String[] args) throws UnsupportedEncodingException {
            String str = "dk你好";
            byte[] byte1 = str.getBytes();
            String res1 = new String(byte1,"gbk");
            System.out.println(res1);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    运行结果

    dk浣犲ソ
    
    Process finished with exit code 0
    
    • 1
    • 2
    • 3

    我们发现有乱码产生。那为什么呢?因为编码的时候,采用的是默认的utf-8方式,所以解码的时候,也需要使用utf-8进行解码,如果使用gbk就会产生乱码。因为utf-8和gbk对中文所占的字节数是不一样的。

    • 如果采用的是UTF-8的编码方式,那么1个英文字母 占 1个字节,1个中文占3个字节
    • 如果采用GBK的编码方式,那么1个英文字母 占 1个字节,1个中文占2个字节

    五、额外知识扩展

    1、什么是字符集?
    字符集顾名思义,就是用来装多个字符的集合。不同的字符集中字符的个数是不同的,包含的字符也是不同的,甚至对于字符的编码格式也是不同的。

    2、什么是字符编码?
    计算机中存储信息都是以二进制数表示的,而我们在电脑屏幕上看到的文字、数字、英文、标点符号等都是将二进制数转换过后的结果,按照某种规则,将计算机中的二进制数与某个抽象字符集合一一对应,这就是字符编码。

    3、ASCII字符集
    ASCII 全称 (American Standard Code for Information Interchange)美国信息交换标准代码,它是基于拉丁字母的一套电脑编码系统,其最初在创建的时候主要是为了显示英语以及一些西欧语言,是国际通用的信息交换使用标准码。ASCII使用了7位二进制来表示128个字符和符号,目前已经停止更新。

    4、Unicode字符集
    ASCII字符集只包含了128个字符,对于全世界的所有语言来说,并不能容纳下世界上所有的语言。所以Unicode字符集出现了。
    Unicode又被称为统一码、万国码,是国际组织制定的用来容纳全世界字符的编码方案。是的,确切的说Unicode是一种编码方案,以实现跨语言、跨平台的文本处理、转换的要求。
    但是Unicode只是一种字符与二进制数之间的一种逻辑映射编码,它并没有指定在计算集中应该如何的进行存储。所以此时就需要一种编码格式用来指定Unicode字符集中的字符是如何进行编码的。
    在Unicode官方资料中,Unicode编码方式有三种:UTF-8、UTF-16、UTF-32,而其中UTF-8编码成为了现今互联网使用较多的编码方式。

    5、GB2312
    GB2312编码是第一个汉字编码国家标准,于1980年由中国国家标准总局发布。其中共收录了汉字6763个。但是由于我国的汉字非常多,GB2312收录的汉字不够用了,所以GBK诞生了。GBK包含了GB2312的所有内容的同时还新增了20000多新的汉字,对于一些日常需求已经为完全够用了。

  • 相关阅读:
    143. 等差数列
    猿创征文 | 大学生应该知道的开发工具
    Docker部署Tomcat及Web应用
    JavaScript高级知识-浏览器的解析以及JS运行原理
    安卓连接mysql数据库,使用okhttp
    Arduino Esp8266 Web LED控制
    element computed校验方式
    Java中&和&&的区别
    开发者的福音:TinyVue 组件库文档大优化!类型更详细,描述更清晰!
    6+孟德尔随机化。
  • 原文地址:https://blog.csdn.net/weixin_43860634/article/details/133838023