我想对url编码一个python字符串并使用希伯来字符串获得异常。
我无法解决它并开始做一些猜测导向的编程。
最后,在将mystr = mystr.encode("utf8")
发送到url编码器之前执行此操作会保存当天。
有人可以解释发生了什么吗? .encode(“utf8”)有什么作用?我的原始字符串无论如何都是unicode字符串(即以u为前缀)。
答案 0 :(得分:13)
我的原始字符串无论如何都是unicode字符串(即以u为前缀)
......这是问题所在。它不是“字符串”,而是“Unicode对象”。它包含一系列Unicode代码点。当然,这些代码点必须具有Python所知道的一些内部表示,但是当你\uXXXX
时,它们被抽象出来并被显示为那些print repr(my_u_str)
实体。
要获得另一个程序可以理解的字节序列,您需要获取该Unicode序列点序列并对其进行编码。您需要决定编码,因为有很多可供选择。 UTF8和UTF16是常见的选择。 ASCII也可以,如果它适合。 u"abc".encode('ascii')
工作正常。
执行my_u_str = u"\u2119ython"
,然后type(my_u_str)
和type(my_u_str.encode('utf8'))
查看类型的差异:第一个是<type 'unicode'>
,第二个是<type 'str'>
。 (无论如何,在Python 2.5和2.6下)。
Python 3中的情况有所不同,但由于我很少使用它,如果我试图说出任何权威的话,我就会说出来。
答案 1 :(得分:9)
原始字符串是包含原始Unicode代码点的unicode对象,在将其编码为UTF-8后,它是包含UTF-8编码数据的普通字节字符串。
URL编码器似乎需要一个字节字符串,因此它可以对一个接一个的字节进行URL编码,而不必处理Unicode代码点。当你给它一个unicode对象时,它会尝试使用一些默认编码将其转换为字节字符串,可能是ASCII。对于无法表示为ASCII的希伯来字符,这将导致错误。
答案 2 :(得分:4)
.encode(“utf8”)做了什么?
这取决于您使用的Python版本:
str
对象(以UTF-16或UTF-32编码)转换为包含字符串的UTF-8表示形式的bytes
对象。unicode
对象转换为以UTF-8编码的str
对象。但str
也有encode
方法,写'...'.encode('UTF-8')
等同于撰写'...'.decode('ascii').encode('UTF-8')
。由于您提到了“u”前缀,因此您必须使用2.x.如果你不需要任何2.x-only库,我建议切换到3.x,它在文本和二进制数据之间有明显的区别。
Dive into Python 3对此问题有一个很好的解释。
有人可以解释发生了什么吗?
如果您告诉我们错误消息是什么会有所帮助。
urllib.quote
函数需要str
个对象。它也适用于仅包含ASCII字符的unicode
个对象,但在包含希伯来字母的情况下则不行。
在Python 3.x中,urllib.parse.quote
同时接受str
(= Python 2.x unicode
)和bytes
个对象。字符串以UTF-8自动编码。
答案 3 :(得分:1)
“...”。encode(“utf-8”)将字符串的内存中表示形式转换为UTF-8编码的字符串。
url编码器可能需要一个字节字符串,即字符串表示,其中每个字符用一个字节表示。
答案 4 :(得分:0)
它返回Unicode字符串的UTF-8编码版本mystr。重要的是要意识到UTF-8只是编码Unicode的一种方式。 Python可以与许多其他编码一起使用(例如,mystr.encode(“utf32”)或甚至mystr.encode(“ascii”))。
答案 5 :(得分:0)
balpha发布的link解释了这一切。简而言之:
你的字符串以“u”为前缀这一事实意味着它由Unicode 字符(或代码点)组成。 UTF-8是将此字符串编码为 bytes 的序列。