2014-02-26 3 views
1

Я следовал через Питон tutorial на юникод и у меня есть простой вопрос, чтобы спросить: Когда я открываю оболочки питона и тип:Python Unicode кодирование с использованием UTF-8

>>> unicode('\x80abc') 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0: ordinal 
not in range(128) 

я получаю выше, так как python пытается преобразовать байт \ x80 в unicode, используя кодировку ascii, которая может достигать 127. (\ x80 - 128).

Однако, если я еще раз попытаться использовать й кодировке UTF-8, я снова получаю сообщение об ошибке, хотя несколько иная:

>>> unicode('\x80abc', 'utf8') 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode 
return codecs.utf_8_decode(input, errors, True) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 0: invalid s 
tart byte 

Что здесь происходит, и как я должен правильно это сделать?

+0

Что такое кодировка в консоли? –

+0

Это Windows cmd, используя кодовую страницу 737. – kstratis

ответ

1

Во-первых, '\x80abc' является байтовой строкой (в Python < 3). Если вы хотите преобразовать байтовую строку в строку юникода, у вас есть два варианта: либо вы: reinterpret все байты как однобайтовые символы Юникода (вы можете просто добавить u в строковый литерал, а затем: u'\x80abc'), или вы предполагаете, что строка байтов - строка Юникода, закодированная с использованием конкретного кодека (например, ASCII, Latin1, UTF-8 и т. д.); то вы бы пошли, как вы пытались: декодирование это.

Вызов unicode() - это явное декодирование. Как указывал Пауло, \80 недействителен в UTF-8, поскольку он недействителен в ASCII. Вы можете попробовать Latin1, однако, это будет работать, поскольку он позволяет байт \x80 в своем потоке.

+0

+1 Я не хотел, чтобы вы продвигали вас, потому что мне понравилось, что у нас была такая же репутация LOL, но это хороший ответ. –

+1

Давайте посмотрим, как долго мы сможем сохранить репутацию _same_ :-D – Alfe

3

Просто случилось, что \x80 не является действительным байтом в UTF-8.

Посмотрите на the charset for UTF-8 и посмотрите, что один байт коды заканчиваются в \x7f.

Если вы хотите доказать свой пример, попробуйте с latin1 и персонажем ñ: unicode('\xf1abc','latin1'). Без кодировки он не сработает, и с ним он пройдет.

Смежные вопросы