四、字符编码:ascii、gbk、Unicode、utf-8

本文深入探讨了计算机中字符编码的发展历程,从ASCII到GBK,再到Unicode和UTF-8,详细解释了编码与解码的概念及其重要性。揭示了乱码产生的原因及解决方法,帮助理解不同操作系统和软件的默认编码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编码和解码:

编码(encode)和解码(decode):计算机中储存的信息都是用二进制数表示的;而我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果。通俗的说,按照何种规则将字符存储在计算机中,如’a’用什么表示,称为”编码”;反之,将存储在计算机中的二进制数解析显示出来,称为”解码”。在解码过程中,若使用了同编码方式不同的编码规则饿,则可能导致解析错误或者乱码。

字符编码发展历程:

编码规则历史:
信息经过编码成二进制再存到硬盘当中。计算机只认识二进制0,1,基本信息单位是8位0,1组成的字节。
s首先对容量单位有个大概认识
1byte = 0101010101 = 8 bit 一个字节8位(bit)
1kb = 1000byte 一个几十行的.py文件大小为3kb
1mb = 1000kb 一首mp3个区大概5mb左右
1GB = 1000Mb = 1000000kb 一个电影大概2G左右,固态硬盘大约250G
1TB = 1000G 一个大容量机械硬盘3Tb

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)

计算机早期内存、硬盘容量小且昂贵。科学家思考,我要在计算机中存
储a,A,1,0常见字母、数字、运算符。想出了一套编码方式ascii(美国信息交换标准代码),
ascii编码:用8位二进制,也就是1byte字节,来表示常见英文大小写、数字定义表示出来,
2**8(2的8次方)一共有256种可能,足够表示出常见字母、数字、运算符、分特殊符。如01100001 代表字母a

gbk 编码:

后来计算机渐渐发展,传到了国外,中国,韩国,日本,欧洲等。
中国大陆的科学家为了使用计算机,为了存储汉字,也发明了一套编码gbk2312。
GB2312:汉字有几万种,一个字节256种排列不够,所以用两个或更多字节存储汉字。
这套编码方式可以编码两万多个汉字。
GB18030:GB2312发现不够用,繁体字特殊字符。所以人们补充新标准,可以编码7万多汉字。
上面两种具体编码方式都属于GBK编码方式。

Unicode (也称之为万国码、统一码):

与此同时,中国台湾省、日本、韩国等等其他国家都研究出了自己国家的编码方式。Erxxx.
全世界有很多套编码方式,自己国家网站和软件可以使用,但跟其它使用时经常有于编解码方式不统一而出现
乱码错误,不利软件知识在世界范围内的沟通交流。编码方式混乱。

出现乱码的原因在于编码和解码不匹配,比如台湾某网站用某编码方式编繁体字,你用电脑打开,电脑默认用gbk解码,
由于规则不对应,所以乱码。列如编码规则1“abc…对应123…" 编码规则2”abc…对应567…"这样信息经规则1转换后
为“123”,“123”经规则2解码后错误出现乱码。

为了改变这种混乱的编码状况,计算机的硬盘价格开始降低,容量增大,一个国际组织定义了一套统一的编码方式,
Unicode(union)。unicode编码方式用4到6个字节进行编码,2的32次方42亿多种可能。可以把所有国家的文字都编码进去(俗称万国码),
还包括特殊字符(希腊字母、数字字符),还包括emoji表情图。

但是用unicode编码后,还有一些问题。一是计算机接收到了四个字节,到底是ascii编码的4个字符还是unicode编码的一个字母
二是纯英文信息的话,unicode编码占用磁盘体积将是ascii编码的4倍,浪费大。ascii编码的字母a的二进制位01100001,
unicode 编码兼容ascii编码,字母a第一个字节跟sacii编码一致,其它三个字节填充0,最终unicode编码的a是00000000 00000000
00000000 01100001.

utf-8(可“变长”编码):

为了避免上述缺点,提供了几种优化后的存储方式,比如utf-8.utf-16,utf-32. 目前最常用的是utf-8.
utf-8使用变长1-4个字节存储信息,比如上面unicode编码的a,只存储有用的一个字节,而当遇到中文时,用2-3字节来存储,
这样的话既保证兼容,又能以较小的存储空间存储。
unicode 是一种编码方式,编码思想,utf-8是unicode一种具体的实现方法。
UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式
utf-8(可变长编程):UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。 如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间:
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,
编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:

特点:

1)在处理经常会用到的ASCII字符方面非常有效,UTF-8是ASCII的一个超集。因为一个纯ASCII字符串也是一个合法的UTF-8字符串,所以现存的ASCII文本不需要转换。在处理扩展的拉丁字符集方面也不比UTF-16差。对于中文字符来说,比UTF-32要好。
2)UTF-8不再存在字节顺序的问题,一份以utf-8编码的文档在不同的计算机之间是一样的比特流。UTF-8字符串可以由一个简单的算法可靠地识别出来。就是,一个字符串在任何其它编码中表现为合法的UTF-8的可能性很低,并随字符串长度增长而减小。
3)UTF-8和UTF-16都是可扩展标记语言文档的标准编码。所有其它编码都必须通过显式或文本声明来指定。
4)任何面向字节的字符串搜索算法都可以用于UTF-8的数据(只要输入仅由完整的UTF-8字符组成)。但是,对于包含字符记数的正则表达式或其它结构必须小心。

缺点:

utf-8在Unicode字符串中不可能由码点数量决定显示它所需要的长度,或者显示字符串之后在文本缓冲区中光标应该放置的位置,组合字符、变宽字体、不可打印字符和从右至左的文字都是其归因。此外,因为每个字符使用不同数量的字节编码,所以寻找串中第N个字符是一个O(N)复杂度的操作 — 即,串越长,则需要更多的时间来定位特定的字符。同时,还需要位变换来把字符编码成字节,把字节解码成字符。

乱码原因和解决办法

对于是否乱码的判断关键在于:判断当前编码解码方式是否一致以及该字符集是否兼容该文字(比如中文)。也就是说,乱码的出现是因为编码和解码时用了不同或者不兼容的字符集。比如说一个用UTF-8编码后的字符,用GBK去解码。由于两个字符集的字库表不一样,同一个汉字在两个字符表的位置也不同,最终就会出现乱码。再比如说ACSII字符集不支持中文编码解码,输出中文时会出现乱码。

其他说明:加入文本中所有字符都在ASCII范围内,即英文字符等,那记事本保存的ASCII或UTF-8是一样的。

关于操作系统:

windows 操作系统默认gbk;mac0S和linux默认的utf-8。
windows 记事本默认gbk, 但win上的pycharm、sublime默认utf-8。
所以平时新建文件建议使用pycharm或sublime。

1)修改原文件:windows 记事本另存为的时候可以修改编码为utf-8 .
2)修改解码方式:pycharm打开一个gbk文件时会提示reload in gbk 。

参考网址点击这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值