Python2的编码问题

本文探讨Python2中的编码问题,重点在于Unicode及其与其他编码(如UTF-8和GBK)的关系。在Python2中直接处理汉字会导致ASCII编码错误,需要在文件开头添加声明或者进行字符串与Unicode之间的转化。通过实例解析了如何在不同编码间正确转换以避免乱码问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值