带你走进编码的世界——Unicode编码
本文作者:孙晓玲
文字编辑:宁刘莹
技术总编:张 邯
爬虫俱乐部将于2019年8月22日至28日在湖北武汉举行为期一周的Stata编程技术定制培训,此次培训采用Stata16进行讲解,采取初级班和高级班分批次培训。课程通过案例教学模式,旨在帮助大家在短期内掌握Stata软件编程、金融计量知识和实证分析方法,使大家熟悉Stata核心的爬虫技术,以及Stata与其他软件交互的高端技术。目前正在火热招生中~
详细培训大纲及报名方式,请点击文末阅读原文呦~
默认情况下,Python源码文件以UTF-8编码方式处理。在这种编码方式中,世界上大多数语言的字符都可以同时用于字符串字面值、变量或函数名称以及注释中。那编码是怎么一回事?Unicode编码是怎么来的?在Python中又该如何查看一个字符串的编码呢?今天的推文将为大家解答有关编码的疑惑。
一、什么是编码?
计算机编程语言中,编码是指用代码来表示数据资料,使其成为计算机可处理和分析的信息,即将数据信息从一种形式转换为另一种形式的过程。
二、编码的历史发展及Unicode编码的由来
我们知道计算机只能处理二进制的数字,这为计算机提供了高速的运行速度。在往期推文中我们已经介绍过不同进制数字之间的转换,因此在这里不做赘述。除了数字,字符串也是一种数据类型,如果计算机要处理字符串,就必须先把字符串转换为数字才行。美国人发明了计算机,设置了最早的编码,他们只将数字、大小写英文字母及一些符号一共128个字符编码到计算机中。这套编码表就是著名的ASCII编码表,例如大写字母A的二进制编码为01000001,十进制编码为65,十六进制编码为41;小写字母a的二进制编码为01100001,十进制编码为97,十六进制编码为61。
最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节。随着科技进步和科技交流,计算机技术传遍世界,128个编码字符怎能罩得住世界语言的多元化?世界各国的计算机精英们就在ASCII编码的基础上制定了新的编码。例如我们中国的汉字,一个字节是不够处理的,至少需要两个字节。为了把中文编码进去,且不与主流的ASCII编码冲突,中国就制定了GB2312编码。
可想而知的是,全世界有上百种不同的语言,不同语言的国家都编制一套自己的标准,编码的矛盾一定就会出现。例如,在多语言的混合文本编码中,到底应该遵循哪种编码制度?结果可想而知,一定会出现乱码。为了编码界的“和平”,Unicode诞生了。ASCII编码在二进制编码中最高有8位,Unicode编码在二进制中最高有16位,Unicode能够编码的字符比ASCII编码多的多,Unicode编码几乎涵盖了所有的语言,解决了多语言文本的乱码问题。
一套好的编码想要留存下来就需要不断地进步与完善。ASCII编码是1个字节,而Unicode编码通常是2个字节。上面我们说到用ASCII编码时,大写字母A在二进制时为01000001,十进制时为65,但汉字已经超出了ASCII编码的范围,例如汉字“爬”无法用ASCII进行编码,用Unicode编码二进制为0111001000101100,十进制为29229。那如果我们想将用ASCII编码的字符用Unicode编码只需在前面添0就可以啦。
如果统一了编码,在程序员的编码过程中,不排除全是英文的情况,这时候如果还是用Unicode编码将会比原始的ASCII编码多一倍的储存空间,计算机的运行速度将大打折扣。节约是美德!由Unicode编码转化而来的UTF-8编码应运而生。UTF-8编码会根据字符的大小将Unicode字符编码成1-6个字节,英文字符被编成1个字节,汉字通常3个字节,特别复杂的被编成4-6个字节。下图显示了UTF-8编码的字节数对应的储存范围和存储格式。这样储存和运输问题就得到解决啦。
三、Python内置函数ord(c)和chr(i)
如今,Unicode编码在网络、Windows系统及很多大型软件中广泛应用。默认情况下,Python3源码文件以UTF-8编码,所有字符串都是Unicode编码的。往期的推文为大家介绍了很多Python的内置函数,下面将为大家介绍Python中关于编码的两个内置函数。
1.ord(c)函数
对于单个Unicode字符的字符串,ord(c)函数返回字符串c的Unicode编码码点的整数。作为验证,我们输入上文提到的字母“A”和汉字“爬”,查询返回的Unicode码点整数及其对应的二进制数。
In [1]: ord('A')
Out[1]: 65
In [2]: bin(65) #将十进制转化为二进制
Out[2]: '0b1000001'
In [3]: ord('爬')
Out[3]: 29228
In [4]: bin(29228)
Out[4]: '0b111001000101100'
输出结果与上文提到的一致。
2.chr(i)函数
chr(i)函数是ord(c)函数的逆函数,它能返回Unicode编码为整数i的字符的字符串格式。例如我们想知道Unicode编码为整数65和整数520的字符串,就可以这样得到:
In [5]: chr(65)
Out[5]: 'A'
In [6]: chr(520)
Out[6]: 'Ȉ'
输出结果显示,Unicode编码为整数65和520的字符串分别为字母“A”和符号“Ȉ”。这对互逆的函数兄弟的用法就介绍到这里,下面为大家介绍一个有趣的例子。
3.字符串的大小比较
我们知道数字可以比较大小,那在计算机中字符串能否比较大小呢?答案是肯定的。设置两个字符串str1=‘a’,str2=‘b’,然后对两个字符串进行大小比较。
In [7]: str1 = 'a'
str2 = 'b'
print(str1 > str2)
False
输出结果为False,即字符串‘a’并不大于字符串‘b’。这里为大家引入一个小知识,在Python中字符串的大小比较转化为其相应位置字符的编码的大小,我们利用刚刚介绍的ord(c)函数计算它们的编码。
In [8]:print(ord('a'))
print(ord('b'))
Out[8]:97
98
通过输出结果可知,‘a’的编码为97,‘b’的编码为98,所以输出结果为False,是不是很有意思呢?
关于编码的问题就介绍到这里啦!
对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!
往期推文推荐
万般进制千机变,Python一计乾坤定——利用Python来进行进制转换
关于我们
微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。
此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。