常见字符集

数据在计算机中如何存储?

计算机中任意的数据都是以二进制进行存储的,一个二进制位也就是一个bit,但是1个bit能存储的信息太少了,所以就把8个bit分为一组,这样的一组称为一个字节,是计算机中最小的存储单元了。

ASCII

欧洲那边的字符很少,所以将用到的128个字符挨个进行编号,从0一直编到了127,这些编号又称为码点,为这些字符编好了码点之后,字符以及对应的码点称为字符集,也叫编码集。

什么是字符集?

总结来说就是给字符编个数字。

那么上面这一套字符集就称之为ASCII字符集。

编码:把要存储的数据变成真正能在内存中存储的数据。

那么ASCII字符集是如何将这些字符存入到计算机的底层中呢?或者说如何对字符进行编码?

常见的操作是对码点进行编码,编码规则就是直接将码点转换为二进制,由于是0~127,只有7个bit,是不够1个字节的,所以在高位的第8个bit上补个0。

所以ASCII字符集用1个字节存储字符。

GB2312

其中GB是国家标准的简称。

GBK

全称GuoBiaoKuozhan国标扩展。

简体中文版Windows默认使用的是GBK字符集。

注意:GBK是兼容了ASCII字符集的,比如字符a的码点还是97。

英文编码规则:用一个字节进行存储,不足8位时前面补0。

汉字编码规则:一个汉字使用2个字节进行存储。两个字节分为高位和低位,高位字节中的第一位一定是1,这是为了与英文区分开。

Unicode

万国码,因为每个国家都提出了自己国家的字符集,不兼容,所以由一个组织对全部国家的字符进行编码。

Unicode字符集有好几种编码规则,比如UTF-8、UTF-16、UTF-32等等。

UTF-8是一种字符集吗?

Unicode是字符集,而UTF-8是Unicode字符集的一种编码规则。

最早提出的UTF-32就是无论英文还是中文都是用4个字节表示一个字符,对于英文来说好像有点浪费啊,于是又提出了UTF-8编码规则。UTF-8使用1-4个字节编码。

英文1个字节,二进制第一位是0,转成十进制之后是整数。

中文3个字节,第一个字节以1110开头,转成十进制之后是负数,第二个和第三个都是以10开头。

解码的时候怎么知道什么时候读取一个字节,什么时候读取3个字节呢?

是根据上面的编码来看的,比如是中文时,读取到为1110,就知道要读取3个字节的数据。

乱码有两个原因:

①编码和解码的规则不一样。

②字节流一次读取一个字节,未读完整个汉字。

为什么使用IO流进行数据拷贝不会乱码?

因为直接读取字节到txt文本中,然后txt也能解码。

为了解决第二种,提出了字符流,即字节流+字符集。

而第一种需将编码和解码的规则设置为一样的。比如JavaWeb中使用GET方式请求数据时中文会乱码,是因为编码使用的是UTF-8,而解码则是Tomcat写死的ISO-189这个,需手动调整为UTF-8,具体则是先获取到字符流,再对字符流使用UTF-8进行解码。

相关推荐
曹牧6 分钟前
在 Eclipse 中配置 Maven 和 Gradle 项目以支持增量打包
java·eclipse·maven
_olone9 分钟前
牛客每日一题:显生之宙(Java)
java·开发语言·算法·牛客
Sirens.11 分钟前
Java 包装类、泛型与类型擦除
java·开发语言·javac
小光学长27 分钟前
基于ssm的膳食健康管理系统e6whl4q7(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·开发语言·数据库·学习·ssm
java1234_小锋28 分钟前
Java高频面试题:Redis到底支不支持事务啊?
java·redis·面试
无心水31 分钟前
【常见错误】2、Java并发编程避坑指南:从加锁失效到死锁,10个案例教你正确使用锁
java·开发语言·python
我爱学习好爱好爱32 分钟前
Kubernetes 1.29集群上部署Java网站项目
java·容器·kubernetes
青衫码上行32 分钟前
【项目开发日记 | Java架构】第一天
java·开发语言·spring cloud
DJ斯特拉44 分钟前
自定义jar包导入maven&&注册第三方bean
java·maven·jar
j_xxx404_1 小时前
力扣困难算法精解:串联所有单词的子串与最小覆盖子串
java·开发语言·c++·算法·leetcode·哈希算法