python2的编码问题

在使用Python2做中文相关代码时候,如果不是很熟悉Python2中的编码,那么十有八九你会被这个搞的很烦,所以下面就把编码问题搞个明白

名词解释

ASCII码

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

ASCII码一共规定了128个字符的编码,比如空格"SPACE"是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0

Unicode编码

英语只用ASCII码就足够了,但其它语言不行啊,所以就会有很多编码方式。编码方式不同,就会出现乱码的问题。

那么这时候有这么一种编码,把所有的符号都纳入其中,就不再会有乱码的问题,这就是Unicode。

UTF-8

UTF-8就是Unicode的一种实现方式,是当前比较通用的一种编码方式。为什么不直接用Unicode呢,因为太浪费空间了。

为什么要编码和解码

计算机内存中,统一使用Unicode编码,需要保存或者传输时,转换成UTF8编码。

那么编码就是从Unicode转换成UTF-8或者ASCII,解码就是从UTF-8或ASCII转化为Unicode。

编码和解码是为了不出先乱码,可以正常的读写。

Python2中的编码

声明文件

Python2中默认的文件编码格式为ASCII码,所以我们一般会在文件开头声明文件编码为UTF-8.

# -*- coding: utf-8 -*-
  1. 如果不设置声明文件,则按照python2默认的ASCII码编码方式
  2. 如果声明编码和实际编码不一致,则会按照实际编码读取

str和unicode

其次Python2中的有两种类型,一种是 str,另一种是 unicode,如下

str1 = '中国'
print type(str)   #str
str2 = u'中国'
print type(str2)  #unicode

从str到unicode为解码,从unicode到str为编码,在输出的时候,输出为unicodes时可以正常显示,这样是较为通用的一种形式。

# -*- coding:utf-8 -*-

str1 = u"你好"
print str1  # unicode正常输出
str2 = str1.encode('utf-8') # 编码为UTF-8的格式
print str2    # 乱码
str3 = str1.encode('gbk')   # 编码为GBK格式
print str3    # gbk格式正常输出

输出unicode不会乱码,windows下控制台的编码格式为gbk,所以编码为gbk格式不会出错,但编码为UTF-8和控制台gbk不符所以乱码。

# -*- coding:utf-8 -*-

str1 = "你好"
print str1  # 编码UTF-8 乱码
str2 = str1.decode('utf-8') # 解码为unicode
print str2  # unicode正常显示
str3 = str1.decode('utf-8').encode('gbk') # 编码为gbk和控制台一致正常显示

总结

文件实际编码格式和声明编码格式统一采用UTF-8,涉及到存储相关的统一转换为unicode,输出时候再转换为UTF-8或者gbk即可。

--EOF--

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容