繁体   English   中英

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

[英]Python: what does “…”.encode(“utf8”) fix?

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

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

我的原始字符串无论如何都是unicode字符串(即以au为前缀)

......这是问题所在。 它不是“字符串”,而是“Unicode对象”。 它包含一系列Unicode代码点。 当然,这些代码点必须具有Python所知道的一些内部表示,但无论它是什么都被抽象出来,当你print repr(my_u_str)时它们被显示为\\uXXXX实体。

要获得另一个程序可以理解的字节序列,您需要获取Unicode代码点序列并对其进行编码。 您需要决定编码,因为有很多可供选择。 UTF8和UTF16是常见的选择。 ASCII也可以,如果它适合。 u"abc".encode('ascii')工作得很好。

my_u_str = u"\ℙython" ,然后type(my_u_str)type(my_u_str.encode('utf8'))以查看类型的差异:第一个是<type 'unicode'> type(my_u_str.encode('utf8')) <type 'unicode'> ,第二个是<type 'str'> (无论如何,在Python 2.5和2.6下)。

Python 3中的情况有所不同,但由于我很少使用它,如果我试图说出任何权威的话,我就会说出来。

原始字符串是包含原始Unicode代码点的unicode对象,在将其编码为UTF-8之后,它是包含UTF-8编码数据的普通字节字符串。

URL编码器似乎需要一个字节字符串,因此它可以对一个接一个的字节进行URL编码,而不必处理Unicode代码点。 当你给它一个unicode对象时,它会尝试使用一些默认编码将其转换为字节字符串,可能是ASCII。 对于无法表示为ASCII的希伯来字符,这将导致错误。

.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,它在文本和二进制数据之间有明显的区别。

深入研究Python 3可以很好地解释这个问题。

有人可以解释发生了什么吗?

如果您告诉我们错误消息是什么会有所帮助。

urllib.quote函数需要一个str对象。 它也适用于仅包含ASCII字符的unicode对象,但在包含希伯来字母时则不行。

在Python 3.x中, urllib.parse.quote接受str (= Python 2.x unicode )和bytes对象。 字符串以UTF-8自动编码。

“...”。encode(“utf-8”)将字符串的内存中表示转换为UTF-8编码的字符串。

url编码器可能期望一个字节串,即字符串表示,其中每个字符用单个字节表示。

它返回Unicode字符串的UTF-8编码版本mystr。 重要的是要意识到UTF-8只是编码Unicode的一种方式。 Python可以与许多其他编码一起使用(例如,mystr.encode(“utf32”)或甚至mystr.encode(“ascii”))。

balpha发布的链接解释了这一切。 简而言之:

你的字符串以“u”为前缀这一事实意味着它由Unicode 字符 (或代码点)组成。 UTF-8是将此字符串编码为字节序列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM