Python2的编码问题
Unicode
Unicode 的学名是”Universal Multiple-Octet Coded Character Set”,简称为UCS。它为世界上每一种语言的每一个字符定义了一个唯一的字符码,Unicode 标准使用十六进制数字表示,数字前面加上前缀 U+,比如字母『A』的Unicode编码是 U+0041,汉字『中』的Unicode 编码是U+4E2D
其他编码与Unicode的关系
unicode是统一的表达方式,其他编码是对Unicode的具体实现。例如在linux机器中常用的编码方式为utf8,而在windows机器中常用的编码方式为gbk。所以在windows上处理的文件,换到mac下就会出现乱码等问题。当然在mac下的文件,换到windows中也是可能出现乱码问题的。
python2
在python2中直接出现汉字,是会报错的,ascii不能正确的解析某个位置的数据。例如在test.py中包含有以下代码
a = '你是谁'
然后在命令行中执行python test.py
就会报如下错误
File "test.py", line 1
SyntaxError: Non-ASCII character '\xe4' in file test.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
在文件的开头加上 # encoding=utf8
或者# -*- coding: utf-8 -*-
之后,就不会出现这种问题。
str和unicode的转化
>>> a = '你是谁'
>>> a
'\xe4\xbd\xa0\xe6\x98\xaf\xe8\xb0\x81'
>>> b = u'你是谁'
>>> b
u'\u4f60\u662f\u8c01'
>>> a == b
__main__:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
False
>>> a.decode('utf8')
u'\u4f60\u662f\u8c01'
>>> a.decode("utf8") == b
True
实例解析
在mac环境下,用gbk编码写入字符到文件,然后读取解析
>>> a = '你是谁'
>>> with open('test.txt', 'w') as file:
... file.write(a.decode('utf8').encode('gbk'))
...
>>> with open('test.txt', 'r') as file:
... content = file.read()
...
>>> print content
����˭
第一步完成之后,然后打印直接读取的数据,发现是乱码。原因是’你是谁’在存储的时候是gbk编码的。那么在读取的时候,数据也是gbk编码的,在utf8环境中,uft8对这个字符串解析就是乱码了,此字符串是gbk编码的,相当于用utf8这把钥匙在尝试打开gbk编码的大门,显然是不行的。
这个时候就需要首先用正确编码方式进行解码为Unicode了
>>> content.decode('gbk')
u'\u4f60\u662f\u8c01'
在转化成了Unicode之后,就可以转化成任何字符编码的字符串了
>>> content.decode('gbk').encode('utf8') == '你是谁'
True
做一个知识型讨饭的,有些闲钱的,觉得对你有用的可以捐点