Python UnicodeDecodeError – Я неправильно понимаю кодировку?

StackOverflow https://stackoverflow.com/questions/368805

Вопрос

Есть мысли, почему это не работает?Я действительно думал, что «игнорировать» будет правильным решением.

>>> 'add \x93Monitoring\x93 to list '.encode('latin-1','ignore')
Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
UnicodeDecodeError: 'ascii' codec can't decode byte 0x93 in position 4: ordinal not in range(128)
Это было полезно?

Решение

…есть причина, по которой их называют «кодировками»…

Небольшая преамбула:думайте о Юникоде как о норме или идеальном состоянии.Юникод — это просто таблица символов.№65 — латинская заглавная А.№937 – греческая столица Омега.Только то.

Чтобы компьютер мог хранить и/или манипулировать Юникодом, он должен кодировать это в байты.Самый простой кодирование Юникод — UCS-4;каждый символ занимает 4 байта, и доступны все ~1000000 символов.Эти 4 байта содержат номер символа в таблицах Юникода в виде 4-байтового целого числа.Еще одна очень полезная кодировка — UTF-8, которая может кодировать любой символ Юникода длиной от одного до четырех байтов.Но есть и некоторые ограниченные кодировки, такие как «latin1», которые включают очень ограниченный набор символов и в основном используются в западных странах.Такой кодировки используйте только один байт на символ.

По сути, Юникод может быть закодированный со многими кодировками, и закодированные строки могут быть декодированный в Юникод.Дело в том, что Юникод появился довольно поздно, поэтому все мы, выросшие на 8-битной системе, набор символов слишком поздно узнали, что все это время мы работали с закодированный струны.Кодировка может быть ISO8859-1, или Windows CP437, или CP850, или, или, или, в зависимости от настроек нашей системы по умолчанию.

Поэтому, когда в исходном коде вы вводите строку «добавить «Мониторинг» в список» (и я думаю, вам нужна строка «добавить «Мониторинг» в список», обратите внимание на вторую кавычку), вы фактически уже используете строку закодированный в соответствии с кодовой страницей вашей системы по умолчанию (по байте \x93, я предполагаю, что вы используете кодовую страницу Windows 1252, «Western»).Если вы хотите получить от этого Юникод, вам нужно декодировать строка из кодировки «cp1252».

Итак, что вы хотели сделать, было:

"add \x93Monitoring\x94 to list".decode("cp1252", "ignore")

К сожалению, Python 2.x включает в себя .encode метод и для строк;это удобная функция для «специальных» кодировок, таких как «zip», «rot13» или «base64», которые не имеют ничего общего с Unicode.

В любом случае, все, что вам нужно помнить для преобразования Юникода туда-сюда, это:

  • строка Юникода получает закодированный в строку Python 2.x (фактически, последовательность байтов)
  • строка Python 2.x получает декодированный в строку Юникода

В обоих случаях необходимо указать кодирование который будет использоваться.

Мне не очень понятно, мне хочется спать, но я очень надеюсь, что помогу.

P.S. Юмористический комментарий:У майя не было Unicode;древние римляне, древние греки, древние египтяне тоже этого не делали.Все они имели свои собственные «кодировки» и практически не уважали другие культуры.Все эти цивилизации обратились в прах.Подумайте об этом, люди!Обеспечьте поддержку Unicode в своих приложениях на благо человечества.:)

PS2 Пожалуйста, не портите предыдущее сообщение словами «Но китайцы…».Однако если вы чувствуете склонность или необходимость сделать это, отложите это, думая, что Unicode BMP заполнен в основном китайскими идеограммами, следовательно, китайский язык является основой Unicode.Я могу продолжать выдумывать возмутительную ложь до тех пор, пока люди разрабатывают приложения, поддерживающие Unicode.Ваше здоровье!

Другие советы

кодирование доступно для строк Юникода, но строка, которая у вас есть, не выглядит как Юникод (попробуйте добавить \x93Monitoring\x93 в список ')

>>> u'add \x93Monitoring\x93 to list '.encode('latin-1','ignore')
'add \x93Monitoring\x93 to list '

Кажется, это работает:

'add \x93Monitoring\x93 to list '.decode('latin-1').encode('latin-1')

Есть ли с этим проблемы?Интересно, когда появятся «игнорировать», «заменить» и другие подобные обработки ошибок кодирования?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top