Python:“...”。encode(“utf8”)修复了什么?

时间:2010-07-20 14:41:40

标签: python unicode internationalization urlencode utf-8

我想对url编码一个python字符串并使用希伯来字符串获得异常。 我无法解决它并开始做一些猜测导向的编程。 最后,在将mystr = mystr.encode("utf8")发送到url编码器之前执行此操作会保存当天。

有人可以解释发生了什么吗? .encode(“utf8”)有什么作用?我的原始字符串无论如何都是unicode字符串(即以u为前缀)。

6 个答案:

答案 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版本:

  • 在Python 3.x中,它将str对象(以UTF-16或UTF-32编码)转换为包含字符串的UTF-8表示形式的bytes对象。
  • 在Python 2.x中,它将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 的序列。