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

在python 2中格式化u'es siouf_1'时出现unicodeencodeerror

  •  0
  • umbe1987  · 技术社区  · 6 年前

    我有这个代码:

    "'{}'".format(u'ES SIOUF_1')
    

    在python 2中运行时,我收到以下错误:

    Traceback (most recent call last):
      File "<interactive input>", line 1, in <module>
    UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 2: ordinal not in range(128)
    

    从python 3运行的相同代码给出:

    >>> "'ES\xa0SIOUF_1'"
    

    我也不需要。我需要的是:

    >>> "'ES SIOUF_1'"
    

    我读了很多关于Python中“编码”和“解码”字符的问题,以及在这方面Python2和3之间的一些差异。

    但是,我真诚地不理解它们,我希望尽可能为这两个版本的Python解决这个问题。

    我注意到的是:

    type(u'ES SIOUF_1')
    

    给予:

    >>> <type 'unicode'> # PYTHON 2
    >>> <class 'str'> # PYTHON 3
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Serge Ballesta    6 年前

    你掉进了一个角落里的陷阱。Unicode定义 U+00A0 ( u'\xa0' 在python符号中)是不间断的空格字符。它的打印效果与普通空间完全相同( U+0020 u'\x20' )但是是一个独特的字符,不在ASCII范围内。

    由于我无法猜测的原因(可能是复制粘贴),您设法在Unicode字符串中获得这个不间断的空间,因此python 3中的奇怪打印以及在python 2中无法将其转换为ASCII。由于在python 2代码中,格式只是一个(字节)字符串,因此Unicode字符串被隐式转换为ASCII,这导致了异常。所以在python 2中,您需要使用unicode格式才能不出错:

    u"'{}'".format(u'ES SIOUF_1')
    

    将在Python3中工作。

    如何修复?

    正确的方法是摆脱冒犯 U’x20’ 在尝试处理之前。如果不能,可以用普通空格明确替换:

    "'{}'".format(u'ES SIOUF_1'.replace(u'\xa0', u'\x20'))
    

    应该给出你想要的,在python 2和python 3中