浅谈编码

您所在的位置:网站首页 ehr编号 浅谈编码

浅谈编码

2023-09-10 13:55| 来源: 网络整理| 查看: 265

大家可能在计算机上看到过类似ASCII, GBK, GB2013,Unicode等等这些东西,但是却搞不清楚它们的关系,没办法正确地使用。再此,特对编码进行简要说明,让大家可以更好地理解和运用。

1. 编码产生的原因

在计算机中,所有的数据在存储和运算时,都要使用二进制数(也就是0和1两个数)表示。但是,具体使用哪些二进制数代表哪个具体的符号,每个地区都有自己约定的一套规则,这就是编码。

 

2.常见编码类型

a. ASCII

ASCII (American Standard Code for Information Interchange),美国信息交换标准代码是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,它是最通用的信息交换标准ASCII。第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符。

由此我们可以看出ASCII是美国人自己搞的一套编码,它可以适用于英语的书写,英语的26个大小写字母以及一些常用的符号都包含在内。

但是,对于其它国家自己的语言来说,这就不适用了。以中文为例,常用的汉字就有5000多个,这个怎么用ASCII码去表示呢?这个是无法表示的。

所以,我们国家研发了自己的一套编码规则,也就是GB 2312-1980和GBK两套编码。

 

b. GB 2312-1980

GB是啥意思? 2312是什么意思? 1980又是什么意思呢?

GB就是汉语拼音国标的首字母,也就是国家标准的意思;

2312是套标准的一个编号,就类似你家的邮政编号一样,只是一个编号而已;

那1980呢? 这个很显然就是年份嘛,就是说这个是在1980年发布的。

那么它完整的意思应该就是:在1980年发布的一套编号为2312的国家标准编码规则。

哈哈,是不是一下就清楚了!?

下面是详解: 

《信息交换用汉字编码字符集》是由中国国家标准总局1980年发布,1981年5月1日开始实施的一套国家标准,标准号是GB 2312—1980。

GB2312编码适用于汉字处理、汉字通信等系统之间的信息交换,通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB 2312。

基本集共收入汉字6763个和非汉字图形字符682个。整个字符集分成94个区,每区有94个位。每个区位上只有一个字符,因此可用所在的区和位来对汉字进行编码,称为区位码。

把换算成十六进制的区位码加上2020H,就得到国标码。国标码加上8080H,就得到常用的计算机机内码。1995年又颁布了《汉字编码扩展规范》(GBK)。GBK与GB 2312—1980国家标准所对应的内码标准兼容,同时在字汇一级支持ISO/IEC10646—1和GB 13000—1的全部中、日、韩(CJK)汉字,共计20902字。

 

c. GBK 

有了GB 2312,中国的计算机事业得以发展壮大。但是发展发展着,发现,诶, GB 2312的的编码不够用了,我们有更多的内容需要传入到计算机里面,怎么办?那就扩展一下嘛,所以就有了GBK 这种编码(我悄悄地告诉你,这个K不就是扩的汉语拼音嘛?)

下面是详解:

1995年,国家颁布了《汉字编码扩展规范》(GBK)。GBK与GB 2312—1980国家标准所对应的内码标准兼容,同时在字汇一级支持ISO/IEC10646—1和GB 13000—1的全部中、日、韩(CJK)汉字,共计20902字。简单来说,不就是可以储存的东西变多了嘛!

 

d. Unicode

上面讲了一下中国的编码方式。但是如果这样看的话,那是不是每个地区都得自己弄一套编码规则啊?世界上有那么多国家,那么多语言,这个怎么办呢?

为了解决这一问题,我们的万国码诞生了。

Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。

这样一来,是不是不同地区的编码就统一了呢? 大家用不同语言写的东西,都可以适用于这一套规则,这多方便啊!

 

e. UTF-8

Unicode码,这里是UTF-8,是不是长得很像啊?都是U开头的。没错,你猜对了,UTF-8又是Unicode的升级版本。为什么会有这个版本呢?

这是因为,对于原本的ASCII码,我们至于要占一个位(使用一个字节的内存)就可以储存信息了,但是Unicode码包含了更多的语言文字,就需要更长的编码去表示一个文字/字符,那么对于原本只需要用ASCII就能解决的问题,用Unicode码去编写,这样就造成了一种极大的浪费,大大占用了计算机的储存空间。所以,UTF-8就是为了解决这个问题而诞生的。

详解:

UTF-8(Universal Character Set/Unicode Transformation Format)是针对Unicode的一种可变长度字符编码。它可以用来表示Unicode标准中的任何字符,而且其编码中的第一个字节仍与ASCII相容,使得原来处理ASCII字符的软件无须或只进行少部份修改后,便可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。

这里的8表示8位元,就是说,一个字符最多可以占8个位置。但是如果只要要一个位置就能表达,就别扯淡去占用空间了,能用一位表示就用一位;不行就两位,再不行就三位........一直到8位。

为啥会乱码???

知道了编码规则,就很好解释为什么会出现乱码现象了。

如果你在大街上看到一个法语单词,你以为这是英语单词,你就去抱着英汉词典去查,这样能查到吗?

有些人要反驳了!

的确有可能查到啊。 比如英文的style和法语的style一模一样,只是发音不同。 

这就对了嘛!!! 所以,有的时候,出现错误了编码,我们还是能看懂一些东西,或者说有那么一部分它的编码还是相通的。

那要怎么去解决乱码的问题呢? 最简单有效的方法就是在代码的后面加上一个encoding = '编码',比如,encoding = 'utf-8'就可以了。 

有的人可能还是不理解,以上图为例,报错出现了UnicodeDecodeError: 'utf-8' codes cant't decode byte 0xd0 in position 0: invalid continuation byte。

这个是什么意思呢? 就是解析解码出错了!!! 使用utf-8无法正确地解析一些编码,那我们换一种编码就好了嘛!!

也就是这个亚子:

f = open('Demo.txt', 'r+', encoding = 'gbk')

注意:可以多尝试不同的编码方式!

如何查看文件的编码方式?

详见:https://jingyan.baidu.com/article/ff42efa9e04733c19e2202f4.html



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3