2014-05-05 39 views
1
>>> 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?爲什麼某些字符串使用utf-16編碼,而其他字符串只使用utf-8編碼?

回答

3

你在問unicode函數解碼一個字節串然後給它編碼錯誤。

粘貼您的字符串爲Python-2.7 OS-X提供了

>>> 'восстановление информации' 
'\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>\[email protected]\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在前面),但這裏的輸出字節 - 包含以相應格式編碼的unicode數據的字符串(它們在開始時不包含u)。