在使用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 -*-
- 如果不设置声明文件,则按照python2默认的ASCII码编码方式
- 如果声明编码和实际编码不一致,则会按照实际编码读取
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--