终于搞懂了Python的编码问题
Python的编码一直很困惑着我,一直不明白为什么要加u,为什么print后会是乱码?因为不管怎样,程序本身是一个文本文件,在计算机中是以二进制字节码的形式存储的,只要编码格式知道,在进行输出的时候进行解码就是了,但为什么在进行输出时英文输出正常,而中文则出现一大堆乱码问题呢?
大概先说一下思路,与记事本等编辑器一样,记事本在进行处理文本文件时第一步的操作是将文本文件读入到内存中,无论该文本文件在硬盘上以什么样的编码格式进行存储,当读入到内存中则需要进行编码转换,转换成记事本软件的内部编码放在内存中。
现阶段的计算机内部编码一般是Unicode编码,记事本这种编辑器软件也采取了这种格式,而Python由于比Unicode编码诞生更早,早期时使用ASCII码。因此类比于记事本编辑器的处理方式,首先将Python源代码文件读入到内存中,并转换成ACILL码统一进行存储,而中文在转化成ASCLL码超过了ASCLL的表达范围,不存在对应的字符因此报错,或者存在一些字符但并非原中文字符,导致最终打印的字符变成一堆乱码。
怎样解决这个问题呢?
很简单,指定字符的编码方式就可以了,让Python在解码时对这些字符进行特殊处理。具体操作方式便是在字符前加u进行表示:u'中文'
。u
表示该字符串按照Unicode编码进行解析,Unicode中包含中文,因此可以打印出中文。而在Python3.x中由于已经默认内存存储编码变成Unicode而不再是ASCLL所以这个问题不复存在了。
不简单的print 函数
另外谈一下print这个最最常用最最简单但也最容易被人忽略的函数。
我们说现在的程序语言比如Python是高级程序语言,相对于汇编语言,功能更加丰富与强大,容易上手。比如说helloworld程序一般几行代码就搞定了,但如果要是换成汇编,则可能会是几十行的代码量,代码量的增加意味着处理逻辑的复杂,与汇编语言相比,程序语言本质上没有发生变化,只不过功能封装与抽象程度远远超过汇编语言。大量普适性的功能被抽象封装成一个功能模块,供开发者直接调用。
print函数也是这样,在进行打印时,print函数首先需要读取内存中的字符串字节流,然后将其进行解码,除非特别指定,对于Python2.x而言则按照ASCLL格式进行解码,最后进行打印出字符。这里的重点是** 在进行打印时首先进行解码的操作**,比如说:
>>> '中文'
'\xe4\xb8\xad\xe6\x96\x87'
>>> print '中文'
中文