Python2的编码问题

Python2的编码问题

Unicode

Unicode 的学名是”Universal Multiple-Octet Coded Character Set”,简称为UCS。它为世界上每一种语言的每一个字符定义了一个唯一的字符码,Unicode 标准使用十六进制数字表示,数字前面加上前缀 U+,比如字母『A』的Unicode编码是 U+0041,汉字『中』的Unicode 编码是U+4E2D

其他编码与Unicode的关系

avatar
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

做一个知识型讨饭的,有些闲钱的,觉得对你有用的可以捐点

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章