【问题标题】:Why do some strings encode in utf-16, while others only encode in utf-8?为什么有些字符串用 utf-16 编码,而另一些只用 utf-8 编码?
【发布时间】:2014-06-21 06:42:09
【问题描述】:
>>> unicode('восстановление информации', 'utf-16')
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
File "C:\Python27\lib\encodings\utf_16.py", line 16, in decode
return codecs.utf_16_decode(input, errors, True)
UnicodeDecodeError: 'utf16' codec can't decode byte 0xb8 in position 48: truncated data

>>> unicode('восстановление информации', 'utf-8')
u'\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438'

为什么这些俄语单词可以用 UTF-8 编码,但不能用 UTF-16?

【问题讨论】:

    标签: python unicode encoding utf-8 utf-16


    【解决方案1】:

    您要求 unicode 函数解码一个字节字符串,然后给它错误的编码。

    在 OS-X 上将你的字符串粘贴到 Python-2.7 中会得到

    >>> 'восстановление информации'
    '\xd0\xb2\xd0\xbe\xd1\x81\xd1\x81\xd1\x82\xd0\xb0\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xb8\xd0\xb5 \xd0\xb8\xd0\xbd\xd1\x84\xd0\xbe\xd1\x80\xd0\xbc\xd0\xb0\xd1\x86\xd0\xb8\xd0\xb8'
    

    在这个阶段它已经是一个 UTF-8 编码的字符串(可能你的终端确定了这个),所以你可以通过指定 utf-8 编解码器来解码它

    >>> 'восстановление информации'.decode('utf-8')
    u'\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438'
    

    但不是 UTF-16,因为那将是无效的

    >>> 'восстановление информации'.decode('utf-16')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_16.py", line 16, in decode
        return codecs.utf_16_decode(input, errors, True)
    UnicodeDecodeError: 'utf16' codec can't decode byte 0xb8 in position 48: truncated data
    

    如果您想将 unicode 字符串编码为 UTF-8 或 UTF-16,请使用

    >>> u'восстановление информации'.encode('utf-16')
    '\xff\xfe2\x04>\x04A\x04A\x04B\x040\x04=\x04>\x042\x04;\x045\x04=\x048\x045\x04 \x008\x04=\x04D\x04>\x04@\x04<\x040\x04F\x048\x048\x04'
    >>> u'восстановление информации'.encode('utf-8')
    '\xd0\xb2\xd0\xbe\xd1\x81\xd1\x81\xd1\x82\xd0\xb0\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xb8\xd0\xb5 \xd0\xb8\xd0\xbd\xd1\x84\xd0\xbe\xd1\x80\xd0\xbc\xd0\xb0\xd1\x86\xd0\xb8\xd0\xb8'
    

    请注意,输入字符串是 unicode(前面有一个 u),但这里的输出是字节字符串(它们在开头没有 u),其中包含在相应的编码中编码的 unicode 数据格式。

    【讨论】:

      猜你喜欢
      • 2014-01-18
      • 1970-01-01
      • 1970-01-01
      • 2014-05-17
      • 1970-01-01
      • 2011-08-09
      • 2012-06-30
      • 1970-01-01
      • 2014-06-09
      相关资源
      最近更新 更多