gpt4 book ai didi

url-encoding - python url unquote后跟unicode解码

转载 作者:行者123 更新时间:2023-12-04 00:02:36 26 4
gpt4 key购买 nike

我有一个 unicode 字符串,如 '%C3%A7%C3%B6asd+fjkls%25asd'我想解码这个字符串。
我用过 urllib.unquote_plus(str)但它工作错了。

  • 预期:çöasd+fjkls%asd
  • 结果:çöasd fjkls%asd

  • 双编码 utf-8 字符( %C3%A7%C3%B6 )解码错误。
    我的 python 版本是 Linux 发行版下的 2.7。
    获得预期结果的最佳方法是什么?

    最佳答案

    您有 3 或 4 或 5 个问题……但是 repr()unicodedata.name()是你的 friend 吗?它们明确地向您展示您所获得的内容,而不会因使用不同控制台编码的人传达 print fubar 的结果而产生混淆。 .

    总结:要么 (a) 您从一个 unicode 对象开始并对其应用 unquote 函数,要么 (b) 您从一个 str 对象开始并且您的控制台编码不是 UTF-8。

    如果如您所说,您从一个 unicode 对象开始:

    >>> s0 = u'%C3%A7%C3%B6asd+fjkls%25asd'
    >>> print repr(s0)
    u'%C3%A7%C3%B6asd+fjkls%25asd'

    这是一个偶然的废话。如果您申请 urllibX.unquote_YYYY()对此,您会得到另一个无意义的 unicode 对象( u'\xc3\xa7\xc3\xb6asd+fjkls%asd' ),打印时会导致您显示的症状。您应该立即将原始 unicode 对象转换为 str 对象:
    >>> s1 = s0.encode('ascii')
    >>> print repr(s1)
    '%C3%A7%C3%B6asd+fjkls%25asd'

    那么你应该取消引用它:
    >>> import urllib2
    >>> s2 = urllib2.unquote(s1)
    >>> print repr(s2)
    '\xc3\xa7\xc3\xb6asd+fjkls%asd'

    查看它的前 4 个字节,它是用 UTF-8 编码的。如果你这样做 print s2 ,如果您的控制台需要 UTF-8,它看起来没问题,但如果它需要 ISO-8859-1(又名 latin1),您将看到有症状的垃圾(第一个字符将是 A-波浪号)。让我们暂时停止这个想法并将其转换为 Unicode 对象:
    >>> s3 = s2.decode('utf8')
    >>> print repr(s3)
    u'\xe7\xf6asd+fjkls%asd'

    并检查它以查看我们实际得到了什么:
    >>> import unicodedata
    >>> for c in s3[:6]:
    ... print repr(c), unicodedata.name(c)
    ...
    u'\xe7' LATIN SMALL LETTER C WITH CEDILLA
    u'\xf6' LATIN SMALL LETTER O WITH DIAERESIS
    u'a' LATIN SMALL LETTER A
    u's' LATIN SMALL LETTER S
    u'd' LATIN SMALL LETTER D
    u'+' PLUS SIGN

    看起来像你说的你期望的那样。现在我们来解决在您的控制台上显示它的问题。注意:当你看到“cp850”时不要 panic ;我正在便携地执行此操作,并且恰好在 Windows 上的命令提示符中执行此操作。
    >>> import sys
    >>> sys.stdout.encoding
    'cp850'
    >>> print s3
    çöasd+fjkls%asd

    注意:unicode 对象是使用 sys.stdout.encoding 显式编码的。幸运的是 s3 中的所有 unicode 字符可以在该编码中表示(以及 cp1252 和 latin1)。

    关于url-encoding - python url unquote后跟unicode解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5139249/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com