代码之家  ›  专栏  ›  技术社区  ›  flybywire

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

  •  9
  • flybywire  · 技术社区  · 14 年前

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

    有人能解释发生了什么事吗?.encode(“utf8”)是做什么的?我原来的字符串是unicode字符串(即前缀为u)。

    6 回复  |  直到 9 年前
        1
  •  9
  •   sth ypicasso    14 年前

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

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

        2
  •  13
  •   Antti Haapala -- Слава Україні    9 年前

    我的原始字符串是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中,情况不同,但是由于我很少使用它,如果我试图对它说些权威性的话,我可能会不知所措。

        3
  •  4
  •   dan04    14 年前

    .encode(“utf8”)是做什么的?

    这取决于您使用的是哪种版本的python:

    • 在python 3.x中,它将 str 对象(以utf-16或utf-32编码)到 bytes 包含字符串的UTF-8表示形式的对象。
    • 在python 2.x中,它将 unicode 对象变成 STR 以UTF-8编码的对象。但是 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字符,但不包含希伯来字母的对象。

    在Python 3 .x中, urllib.parse.quote 接受双方 STR = Python 2。 统一码 ) 字节 物体。字符串自动以UTF-8编码。

        4
  •  1
  •   Cheery    14 年前

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

    URL编码器可能需要一个字节串,即字符串表示法,其中每个字符用一个字节表示。

        5
  •  0
  •   tixxit    14 年前

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

        6
  •  0
  •   Amnon    14 年前

    这个 link 巴尔法的文章解释了这一切。简而言之:

    字符串前缀为“U”的事实意味着它是由Unicode组成的 文字 (或代码点)。utf-8是将该字符串编码为 字节 .