更新Python 2.x时Unicode字符串行为疑难解答->;3.x
我在项目中使用了Python2.7,因为我看到Python3.5即将推出,所以我决定升级我的Python解释器 我正在使用更新Python 2.x时Unicode字符串行为疑难解答->;3.x,python,python-3.x,Python,Python 3.x,我在项目中使用了Python2.7,因为我看到Python3.5即将推出,所以我决定升级我的Python解释器 我正在使用base64编码。由于新Python版本中的字符串对象在某种程度上有所不同,因此出现以下错误: TypeError:'str'不支持缓冲区接口 我已经发现在将字符串传递给此函数之前必须对其进行编码('string'.encode()),但是没有办法将字符串自动编码为unicode或其他格式吗 在Python3中,str的意思是“unicode文本”——无论您将其表示为'mys
base64
编码。由于新Python版本中的字符串对象在某种程度上有所不同,因此出现以下错误:
TypeError:'str'不支持缓冲区接口
我已经发现在将字符串传递给此函数之前必须对其进行编码(
'string'.encode()
),但是没有办法将字符串自动编码为unicode或其他格式吗 在Python3中,str
的意思是“unicode文本”——无论您将其表示为'mystring'
还是u'mystring'
,都没有区别(后者只是为了方便与Python2的移植/共存而被允许的)
要指示字节的二进制字符串,可以使用b'mystring'
正如它所说
此模块提供对二进制数据进行编码的功能
(我的重点)——与文本(即unicode)数据无关。作为逻辑结果,模块中的所有函数都期望或返回字节字符串
不确定为什么不能在程序中直接使用字节字符串(与文本字符串相反),但如果这是一个问题,最简单的方法是将base64
模块中所需的函数包装到您自己的函数中,该函数提供任何编码(文本->字节)或解码(字节->文本)你需要。例如:
import base64
def b64encode(text, codec='utf8'):
return base64.b64encode(text.encode(codec))
然后在剩下的代码中使用这个
b64encode
,而不是直接使用base64.b64encode
,等等,等等作为解码部分。。通过使用ftfy软件包,您可以使生活更轻松(如果需要):
…或者您可以查看chardet库:-
从chardet.universaldetector导入universaldetector
如果您不确定,这将“猜测”文件的编码。感谢您清除此错误,那么我为什么会出现此错误?我该如何修复它sistematically@MalikBrahimi还有避免这样做的方法吗?在我的程序中,Constantli实际上可以使用字节字符串,这样做不是很好,我只是说,每次我必须调用函数时,对字符串进行编码是非常烦人的D@JuanRocamonde,如果您使用字节字符串,那么当然不需要对它们进行编码。只有当您使用文本字符串,但希望将其与只处理二进制数据的功能一起使用时,才需要编码,就像
base64
所做的那样,并且清楚地显示文档。