ANSI,ASCII,Unicode,UTF-8,GB2312编码

ANSI编码:这个是windows系统自带的可以由地区来动态决定的编码,可在系统中设定,你把系统区域设置为美国那就是ASCII,把系统区域设置为中国大陆那就是GB2312简体中文等

ASCII编码:占一个字节,最高位是0,后面7位用来表示字符,一共是128个字符,下图只有94个,除外还有33个不能打印出来的控制符号
在这里插入图片描述
GB2312编码
编码范围:A1A1-FEFE,其中汉字编码范围:B0A1-F7FE

GB2312编码:198151日发布的简体中文汉字编码国家标准。GB2312对汉字采用双字节编码,收录7445个图形字符,其中包括6763个汉字。

BIG5编码:台湾地区繁体中文标准字符集,采用双字节编码,共收录13053个中文字,1984年实施。

GBK编码:199512月发布的汉字编码国家标准,是对GB2312编码的扩充,对汉字采用双字节编码。GBK字符集共收录21003个汉字,包含国家标准GB13000-1中的全部中日韩汉字,和BIG5编码中的所有汉字。

GB18030编码:2000317日发布的汉字编码国家标准,是对GBK编码的扩充,覆盖中文、日文、朝鲜语和中国少数民族文字,其中收录27484个汉字。GB18030字符集采用单字节、双字节和四字节三种方式对字符编码。兼容GBK和GB2312字符集。

Unicode编码:国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台的文本信息转换

Unicode编码:Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,它指的是UCS-2编码方式,就是是直接存入unicode的值来进行编码,unicode的每个值用两个字节来表示,那么它的表示范围就是0-65536个字符,这里面又包含两个方式(Big endian)和(Little endian),默认是后者小头方式,所以一个文本文件如果采用Unicode编码,那么它文件开头两个字节会说明是那种,FF FE表示小头,FE FF表示大头,如果要表示的字符超过了65536,那就使用UCS-4这个编码,它使用四个字节表示一个字符
不管是UCS-2还是UCS-4他只是标记了一个字符唯一的一个值而已,如果我们用这种编码方式会比较死板,就是任何字符都必须要使用2个字节或者四个字节的方式来读取,那么这样就会造成资源的浪费,针对这种浪费就推出了UTF-8编码和UTF-16编码

看这个字符串:1111111111
编码如下

Unicode(大头)编码(26个字节):在这里插入图片描述
UTF-8:(12个字节)在这里插入图片描述
UTF-8-BOM:(15个字节,此处发现相比较UTF-8 多了一个开头EF BB BF)在这里插入图片描述
GB2312(15个字节,此处发现它和UTF-8-BOM的结果一致
在这里插入图片描述
Big5(15个字节,此处发现它和UTF-8-BOM的结果一致)
在这里插入图片描述

UTF-8编码:Unicode编码的一个子集,unicode规定字符编码的长度是两个字节,一个汉字的范围是0X4E00到0x9FA5,这个说的是unicode值,由于unicode编码是固定长度的,所以搞了一个变种出来UTF-8编码,这种编码是不定长的,对于一个字符的存取,既包括了它本身的值也包含了它的控制信息,这个控制信息就是我们要如何读取它,看看uft8是怎么把值控制信息结合在一起的
它的文件开头:EF BB BF

1字节 0xxxxxxx 
2字节 110xxxxx 10xxxxxx 
3字节 1110xxxx 10xxxxxx 10xxxxxx 
4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 
5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 
6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 

跟据上表,解读 UTF-8 编码非常简单。如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节UTF-8
对于某一个字符的UTF-8编码,如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的位数,其余各字节均以10开头。UTF-8最多可用到6个字节

总结
世界上所有的字符都被Unicode统一编码,会给他们一个唯一的值来标记他们,这个值叫Unicode值
对于UTF系列的编码实现,其实就是把字符的Unicode值和控制值镶嵌在一起形成一个新的字符,比如UTF8,它解决了一个问题叫做不定长,定长太废空间了。但对于GB2312这个编码的实现就和unicode值没关系,如果二者想要转换,只能相互查找,unicode相当于一个全世界公认的编码值,GB2312(字符编码,字符值),unicode(字符编码,字符值),转换的过程就是两个map关于key的查找,只是共同的value被赋以不同的值

程序在读取一个文件时,会首先检测它的编码,可以是如下几种
ASCII:一个字节一个字节读
Unicode(UCS-2):两个两个字节读
Unicode(UCS-4):四个四个字节读
UTF-8:不定长的有规律的读,靠拼接出它表示的字符,兼容ASCII值
UTF-16:不定长的有规律的读,靠拼接出它表示的字符,兼容ASCII值
GB2312:不定长的有规律的读,对于汉字是固定两个字节,对于ascall码字符是一个字节,兼容ASCII值

每一种编码格式都会对应一个字符库,可以看出unicode这个库在世界上是最大的,其它的库则会少很多
对于定长的编码格式,它在解析的时候是比较快的,对于不定长的,就会慢点

只有 UTF-8 兼容 ASCII,UTF-32 和 UTF-16 都不兼容 ASCII,因为它们没有单字节编码

核心:现在的计算机内存基本采用Unicode编码,硬盘采用utf-8 编码
内存中的数据需要快速转换,对于定长编码,可以提高速度,但是对于存储到硬盘则不需要快速转换,那这里也可以解释一个问题,我们从硬盘加载一个文件到内存,会首先根据它的编码来把它转换为unicode编码,这个过程就比较耗时间,如果是二进制的话,则可以直接读取

查看字体库

c:Windows/Fonts下放着一堆字体,我们可以去借助字体库翻译网站,来查看字体库中的内容

文件

我们日常接触到的文件分为两种:ascall文件和二进制文件
ascall文件里:只包含94个形象码和1和空格码,不包含看不见的33个控制码
二进制文件:包含33个看不见的控制码和非美标码
也许你会很困惑,为啥只有这两种文件,因为不管是运行内存还是硬盘,他们的存储单位都是一个字节,8个二进制
对于ascall码文件直接比较ascall表就可以直接取出字符了
但对于二进制文件这里就有要区分了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值