操作系统系列(一)常见的几种编码方式

本文详细解析了字符编码的基本概念,包括ASCII、扩展ASCII、Unicode编码体系,重点介绍了UTF-8编码的变长特性及其在互联网上的广泛应用,以及GBK/GB2312/GB18030在中国汉字编码中的角色。
摘要由CSDN通过智能技术生成

一    字符常见的几种编码方式

无论在是在'编辑文本文件'的时候,还是在'制作网页'的时候,总会遇到'文本编码方式'的问题

问题:如果处理不当,就会'出现乱码'的问题

常见的一些'字符编码'方式无非有:'Unicode'、'ASCII'、'GBK'、GB2312、'UTF-8'

二    常见的字符编码方式说明

(1)字节和位的关系

++++++++++++++'字节和位的关系'++++++++++++++

我们知道,计算机内部,所有'信息'最终都是一个'二进制值',每一个二进制位(bit)有0和1两种状态,因此'八个二进制位'就可以组合出'256种状态',这被称为'一个字节'(byte)

1byte=8bit

也就是说: 一个字节一共可以用来表示'256种'不同的状态,每一个状态对应一个符号,就是256个符号,从00000000到11111111

注意: '字符(character)'不等于'符号(symbol;)'

(2) ASCII码

十九世纪'60年代','美国'制定了一套字'符编码',对应'英语字符'与'二进制位'之间的关系,做了'统一规定',这被称为 'ASCII 码',一直沿用至今.

ASCII 码一共'规定了128个字符'的'编码',比如'空格-->SPACE'是32(二进制00100000),'大写的字母'A是65(二进制01000001)

备注1: 这128个符号包括'英文字符'、'阿拉伯数字'、'西文字符'以及'32个控制字符'(不能打印出来的控制符号)它用'一个字节来表示具体的字符',但它只用'后7位'来表示字符(2^7=128),'最前面'的一位统一规定为'0'

备注2:ASCII 表上的数字' 0–31 '分配给了'控制字符',用于控制像打印机等一些'外围设备'

(3)扩展的ASCII码

背景: 原本的ASCII码对于'英文语言的国家'是够用了,但是'欧洲国家'的一些'语言会有拼音',这时'7个字节'就'不够用'了

引出: 因此一些'欧洲国家'就决定,利用'字节中闲置的最高位'编入'新的符号'

比如: 法语中的é的编码为130(二进制10000010)

结果: 这样一来,这些'欧洲国家'使用的编码体系,可以表示'最多256个符号'

+++++++++++++++'扩展ASCII引出的问题'+++++++++++++++

问题引出: 但这时问题也出现了,'不同的国家有不同的字母',因此哪怕它们都'使用256个符号的编码'方式,'代表的字母'却'不一样'

比如:130在'法语编码中'代表了é,在'希伯来语编码中'却代表了字母Gimel (ג),在'俄语编码中'又会代表另一个符号

解决策略: 但是不管怎样,所有这些编码方式中,'0—127表示的符号是一样的','不一样'的只是'128—255'的这一段

引出: 这个问题就直接'促使了Unicode编码'的产生

(4) Unicode符号集

+++++++++'乱码的由来'+++++++++

正如上一节所说: 世界上存在着'多种编码方式','同一个二进制数字'可以被'解释成不同的符号',因此要想'打开一个文本文件',就必须知道它的'编码方式',否则用'错误的编码方式'解读,就会'出现乱码'

举例: 为什么电子邮件常常出现乱码?就是因为'发信人和收信人'使用的'编码方式'不一样

+++++++++'Unicode引出'+++++++++

Unicode就是这样一种编码:它包含了'世界上所有的符号',并且'每一个符号'都是'独一无二'的

比如: U+0639表示'阿拉伯字母Ain',U+0041表示'英语的大写字母A',U+4E25表示汉字"严"

查看方式: 具体的符号对应表,可以'查询unicode.org'或者'专门的汉字对应表'

++++++++++'Unicode是一个符号集'++++++++++

很多人都说Unicode编码('说法不准确'),但其实Unicode'是一个符号集'(世界上所有符号的符号集),而'不是一种新'的编码方式

但是正因为Unicode包含了所有的字符,而'有些国家'的'字符用一个字节'便可以表示,而'有些国家'的字符要用'多个字节'才能表示出来

即产生了两个问题: 

  1)第一:如果'有两个字节'的数据,那'计算机怎么知道'这'两个字节是表示一个汉字'呢?还是'表示两个英文字母'呢?

  2)第二:因为'不同字符'需要的'存储长度'不一样,那么如果Unicode规定用2个字节存储字符,那么英文字符存储时前面1个字节都是0,这就大大'浪费了存储空间'

上面两个问题'造成的结果'是:

  1)出现了unicode的'多种存储方式',也就是说有许多种'不同的二进制格式',可以用来表示unicode

  2)unicode在很长一段时间内'无法推广',直到'互联网的出现'

注意:Unicode '只是一个符号集',它'只规定了'符号的二进制代码,却'没有规定'这个二进制代码应该'如何存储'

 (5) UTF-8

互联网的普及,强烈要求出现一种'统一的编码方式','UTF-8'就是在互联网上'使用最广'的一种unicode的实现方式,'其他实现方式'还包括UTF-16和UTF-32,不过在互联网上'基本不用'

UTF-16(字符用'两个字节'或'四个字节'表示)和 UTF-32(字符用'四个字节'表示)

重复一遍:这里的'关系是'-->'UTF-8是Unicode的实现方式之一'

UTF-8最大的一个特点:就是它是一种'变长的编码方式',它可以使用'1~4个字节'表示一个符号,根据'不同的符号'而变化字节长度

UTF-8的编码规则

1)对于'单字节的符号',字节的'第一位设为0,'后面7位为'这个符号的unicode码',因此对于'英语字母',UTF-8编码和ASCII码是'相同的'

2)对于'多(n)字节'的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10,剩下的'没有提及'的二进制位,全部为这个符号的unicode码

(6)  GBK/GB2312/GB18030

GBK和GB2312都是'针对简体字'的编码,只是GB2312只支持'六千多个汉字'的编码,而GBK'支持1万多个汉字'编码,而GB18030是用于'繁体字的编码',汉字存储时都'使用两个字节'来储存

(7)编码规则

字母'x'表示'可用编码的位'
Unicode符号范围        |        UTF-8编码方式
(十六进制)             |         (二进制)
----------------------+---------------------------------------------
0000 0000-0000 007F   |   0xxxxxxx '英文字符'
0000 0080-0000 07FF   |   110xxxxx 10xxxxxx
0000 0800-0000 FFFF   |   1110xxxx 10xxxxxx 10xxxxxx '汉字'
0001 0000-0010 FFFF   |   11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
跟据上表,'解读 UTF-8 编码'非常简单,如果一个'字节的第一位是0',则这个字节'单独就是一个字符';如果'第一位是1',则'连续有多少个1',就表示'当前字符占用多少个字节'

(8)计算机怎么知道某一个文件到底采用哪一种方式编码

UCS-2 格式可以存储 Unicode 码(码点不超过0xFFFF)。以汉字为例,Unicode 码是4E25,需要用两个字节存储,一个字节是4E,另一个字节是25。存储的时候,4E在前,25在后,这就是 Big endian 方式25在前,4E在后,这是 Little endian 方式。

Unicode 规范定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做"零宽度非换行空格"(zero width no-break space),用FEFF表示。这正好是两个字节,而且FFFE1

如果一个文本文件的头两个字节是FE FF,就表示该文件采用大头方式;如果头两个字节是FF FE,就表示该文件采用小头方式

(9)  小结

ASCII编码:  用来'表示英文',它'使用1个字节'表示,其中'第一位规定为0',其他'7位存储'数据,一共可以表示'128个'字符

拓展ASCII编码:  用于表示更多的'欧洲文字',用'8个位存储'数据,一共可以表示'256个'字符

GBK/GB2312/GB18030:  表示'汉字','GBK/GB2312'表示'简体中文','GB18030'表示'繁体中文'

Unicode编码:  包含世界上所有的字符,是一个'字符集'

UTF-8:  是Unicode字符的'实现方式之一',它使用'1-4个字符-->可变长'表示一个'符号',根据不同的符号而变化字节长度

++++++++++++++'GBK和UTF-8中文字符对应的字节个数'++++++++++++++

GBK: 是在'国家标准GB2312基础'上扩容后'兼容GB2312的标准(好像不是国家标准)',GBK编码'专门'用来'解决中文编码'的,是'双字节'的,不论中英文'都是双字节'的

UTF-8 编码是用以解决'国际上'字符的一种'多字节编码',它对'英文'使用8位(即'一个字节'),'中文'使用24位('三个字节')来编码

对于英文字符较多的论坛则用'UTF-8节省空间',另外如果是外国人'访问你的GBK网页',需要'下载中文语言包'支持,访问UTF-8编码的网页则'不出现'这问题。可以直接访问

字符编码方式 

位(bit)、字节(byte)、字符、编码之间的关系

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值