java之IO流(二)-- 字符集+乱码

1、计算机存储规则

计算机中任意数据都是以二进制的形式存储。
1byte = 8bit,字节是计算机中最小的存储单元。

2、字符集

2.1 相关字符集了解

在这里插入图片描述

2.2 ASCII字符集

在这里插入图片描述
ASCII字符一共有128个。但一个字节最多可表示256个数据,因此存储英文,一个字节就够。
在这里插入图片描述

2.3 GBK字符集

GBK中英文字母的存储:

在这里插入图片描述
GBK中中文的存储和读取:
注:规则2也是为了中文和英文区分开。

在这里插入图片描述
在这里插入图片描述

GBK小练习:

在这里插入图片描述

2.4 Unicode字符集

编码规则:
UTF-8: 用1~4个字节保存(常用)。
UTF-16: 用2~4个字节保存。
UTF-32: 固定使用4个字节保存。

在UTF-8下不同语言的占用字节数:
在这里插入图片描述
在这里插入图片描述

Unicode中英文字母的存储:
在这里插入图片描述
Unicode中中文字母的存储:
在这里插入图片描述
Unicode小练习:
在这里插入图片描述

3、字符集总结(重点掌握)

1.在计算机中,任意数据都是以二进制的形式来存储的。
2.计算机中最小的存储单元是一个字节。
3.ASCII字符集中,一个英文占一个字节。
4.简体中文版Windows,默认使用GBK字符集。
5.GBK字符集完全兼容ASCII字符集:
一个英文占一个字节,二进制第一位是0
一个中文占两个字节,二进制高位字节的第一位是1
6、Unicode字符集的UTF-8编码格式
一个英文占一个字节,二进制第一位是0,转成十进制是正数
一个中文占三个字节,二进制第一位是1,第一个字节转成十进制是负数

4、为什么会出现乱码?

在了解了以上字符集后,我们可以得出出现乱码的原因:

  • 原因一:读取数据时,未读取到完整的汉字。
  • 原因二:编码和解码的方式不统一。

5、解决乱码问题的方法

1、不用字节流读取文本。
2、编码和解码的时候用同一个码表,用同一种编码方式。

问题:
为什么用字节流读取中文时会乱码,使用拷贝时就不会乱码?
因为拷贝的时候是一个字节一个字节拷贝的,没有丢失数据。记事本打开文件时,字符集与数据源字符集一致就不会出现乱码。

6、java中的编码、解码

在这里插入图片描述

public static void main(String[] args) throws UnsupportedEncodingException {
        /**
         * 编码
         */
        String str = "ai加b";
        //使用IDEA,默认值用UTF-8编码,占6个字节
        byte[] byte1 = str.getBytes();
        System.out.println(Arrays.toString(byte1));

        //指定编码方式GBK,占5个字节
        byte[] byte2 = str.getBytes("GBK");
        System.out.println(Arrays.toString(byte2));

        /**
         * 解码
         */
        //使用默认解码方式
        String string1  = new String(byte1);
        System.out.println(string1);

        //指定解码方式,若此时使用默认解码方式UTF-8,就会出现乱码,因为byte2的编码方式是GBK
        String string2 = new String(byte2,"GBK");
        System.out.println(string2);

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值