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

无法在os x terminal.app上解码python中的utf-8字符串

  •  4
  • Bjorn  · 技术社区  · 17 年前

    >>> wtf = u'\xe4\xf6\xfc'.decode()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
    >>> wtf = u'\xe4\xf6\xfc'.decode('utf-8')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/encodings/utf_8.py", line 16, in decode
        return codecs.utf_8_decode(input, errors, True)
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
    

    有人知道我做错了什么吗?

    4 回复  |  直到 17 年前
        1
  •  18
  •   sth    15 年前

    我认为到处都是编码/解码混乱。从unicode对象开始:

    u'\xe4\xf6\xfc'
    

    这是一个unicode对象,三个字符是“·”的unicode代码点。如果你想把它们变成Utf-8,你必须 编码 他们:

    >>> u'\xe4\xf6\xfc'.encode('utf-8')
    '\xc3\xa4\xc3\xb6\xc3\xbc'
    

    如果你打电话 decode(...) ,尝试将字符解释为仍需要转换为unicode的某种编码。因为它已经是Unicode,所以这不起作用。第一个调用尝试Ascii到Unicode的转换,第二个调用尝试Utf-8到Unicode的转换。自从 u'\xe4\xf6\xfc'

    进一步的混乱可能来自以下事实: '\xe4\xf6\xfc' 也是拉丁1/ISO-8859-1编码的“·”。如果您编写了一个普通的python字符串(没有前导的“u”标记为unicode),您可以使用 decode('latin1') :

    >>> '\xe4\xf6\xfc'.decode('latin1')
    u'\xe4\xf6\xfc'
    
        2
  •  4
  •   tzot    17 年前

    我认为编码和解码是反向的。将Unicode编码为字节流,并将字节流解码为Unicode。

    Python 2.6.1 (r261:67515, Dec  6 2008, 16:42:21) 
    [GCC 4.0.1 (Apple Computer, Inc. build 5370)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> wtf = u'\xe4\xf6\xfc'
    >>> wtf
    u'\xe4\xf6\xfc'
    >>> print wtf
    äöü
    >>> wtf.encode('UTF-8')
    '\xc3\xa4\xc3\xb6\xc3\xbc'
    >>> print '\xc3\xa4\xc3\xb6\xc3\xbc'.decode('utf-8')
    äöü
    
        3
  •  3
  •   besen    17 年前
    >>> wtf = '\xe4\xf6\xfc'
    >>> wtf
    '\xe4\xf6\xfc'
    >>> print wtf
    ���
    >>> print wtf.decode("latin-1")
    äöü
    >>> wtf_unicode = unicode(wtf.decode("latin-1"))
    >>> wtf_unicode
    u'\xe4\xf6\xfc'
    >>> print wtf_unicode
    äöü
    
        4
  •  2
  •   dbr    17 年前

    Unicode strings 介绍性教程的一节对此进行了很好的解释:

    要使用特定编码将Unicode字符串转换为8位字符串,Unicode对象提供一个encode()方法,该方法接受一个参数,即编码的名称。编码首选小写名称。

    >>> u"äöü".encode('utf-8')
    '\xc3\xa4\xc3\xb6\xc3\xbc'