【IO流】面试必问!字符集乱码原理竟占大厂面试 30% 分值

 在开始之前,让我们高喊我们的口号:

键盘敲烂,年薪百万!

我听说关注我的人未来都会暴富哦!

目录

键盘敲烂,年薪百万!

我听说关注我的人未来都会暴富哦!

字符集详解

ASCII

GBK(国g标b扩k展)

Unicode

 最后总结重要的:

为什么会有乱码?

读取数据的时候没有读取完整个汉字。

编码和解码的时候方式不统一

怎么不产生乱码? 

编码和解码实现:

字符输入流-空参read详解

 FileReader

空参的read方法

​​​​​​​带参的read方法

字符流输出流写出数据

字符输入流的底层原理解析

 缓冲区长度为8192那么,如果文件长度超过8192会怎么样?

在哪里看缓冲区里的数据?

字符输出流的底层原理

那么flush和close有什么区别呢?flush通道没打断,close则是通道被打断了的。


字符集详解

ASCII

计算机当中数据是以0和1存储数据的,一个0或者一个1就是一个bit(比特位),8个比特为一个字节(byte),这样就可以存储2的8次方,一共258个字符。 字节就是计算机当中最小的存储单元。

计算机存一个字母只需要一个字节就可以了。

GBK(国g标b扩k展)

就是GB2312(1980年发布的简体中文汉字编码标准)->为了容纳台湾等地的繁体所以2000年发布GBK包括了中日韩的大部分汉字。

windows系统默认使用的就是GBK。但是显示是ANSI。不同地区的windows电脑使用的中文编码都不太相同,所以把这些字符集起了个公共名字:ANSI

GBK存英文:

GBK存中文

 一个汉字占两个字节的空间,因为汉字远大于2的八次方256个。两个字节就是2的十六次方六万五千多个汉字。而三个字节就浪费了。两个字节第一个字节是高位字节,后一个是低位字节。高位字节一定是以1开头的。为什么以1开头呢?这样可以和英文字母区分开来,兼容了英文字母(以0开头)而不会混淆。

完整过程:

Unicode

又称万国码(包含这个世界上大多数国家的语言)。

utf-8是Unicode字符集的一种编码方式。

存英文:

在utf-8编码格式中,英文用一个字节存,用ASCII码编码,前面加0后面是正常的二进制。中文是三个字节第一个字节开头是1110,第二个字节开头是10,第三个字节开头是10。 

存中文:

 最后总结重要的:


为什么会有乱码?

读取数据的时候没有读取完整个汉字。

例如一个汉字用Unicode的utf-8方法存的,而用字节流一个字节一个字节的读取的话,会把一个汉字三分之一读出来,那么这样就会找不到而显示?或者空方框

编码和解码的时候方式不统一

正常:

​​​​​​​

 乱码:

怎么不产生乱码? 

  1. 不要用字节流读取文本文件
  2. 编码和解码时使用同一个码表,同一个编码方式

为什么拷贝的时候不会乱码?

因为拷贝是把文件的字节一个一个拷贝到另一个文件当中,如果用符合拷贝过来的编码方式进行解码打开就不会乱码。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是奋斗小杨啊

小额打赏,激励更多精彩分享!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值