Python UnicodeDecodeError - я неправильно кодирую?
мысли о том, почему это не работает? Я действительно думал, что "игнорировать" будет правильно.
>>> 'add x93Monitoringx93 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)
5 ответов:
...есть причина, по которой они называются "кодировками"...
небольшая преамбула: подумайте о unicode как о норме или идеальном состоянии. Unicode-это просто таблица символов. №65-Латинская столица А. №937-греческая столица омега. Только это.
чтобы компьютер мог хранить и / или манипулировать Юникодом, он должен кодирование в байты. Самый простой кодирование Unicode - это UCS-4; каждый символ занимает 4 байта, и все ~1000000 персонажи доступны. 4 байта содержат число символа в таблицах Юникода в виде 4-байтового целого числа. Еще одна очень полезная кодировка-UTF-8, которая может кодировать любой символ Юникода с одним до четырех байтов. Но есть также некоторые ограниченные кодировки, такие как "latin1", которые включают очень ограниченный диапазон символов, в основном используемых западными странами. Такие кодировок использовать только один байт на символ.
в принципе, Unicode может быть закодированных С многие кодировки и кодированные строки могут быть декодируются в Unicode. Дело в том, что Unicode пришел довольно поздно, поэтому все мы, выросшие с помощью 8-битного набор символов слишком поздно узнал, что все это время мы работали с закодированных строки. Кодировка может быть ISO8859-1, или windows CP437, или CP850, или, или, или, в зависимости от нашей системы по умолчанию.
поэтому, когда в исходном коде вы вводите строку "добавить" мониторинг "в список" (и я думаю, что вы хотели строка "добавить" мониторинг "в список", обратите внимание на вторую цитату), вы на самом деле используете строку уже закодированных в соответствии с кодовой страницей Вашей системы по умолчанию (по байту \x93 я предполагаю, что вы используете кодовую страницу Windows 1252, "Western"). Если вы хотите получить Unicode от этого, вам нужно расшифруйте строка из кодировки "cp1252".
Итак, что вы хотели сделать, было:
"add \x93Monitoring\x94 to list".decode("cp1252", "ignore")
жаль, что Python 2.х включает в себя
.encode
метод строки тоже; это удобная функция для" специальных "кодировок, таких как" zip "или" rot13 "или" base64", которые не имеют ничего общего с Unicode.в любом случае, все, что вам нужно помнить для ваших преобразований Юникода туда и обратно:
- строка Юникода получает закодированных к питону 2.X строка (на самом деле, это последовательность байт)
- питон 2.х строки декодируются в строку Unicode
в обоих случаи, вам нужно указать кодирование это будет использоваться.
Я не очень ясно, я хочу спать, но я очень надеюсь, что я помогу.
PS юмористическая сторона Примечание: у Майя не было Unicode; древние римляне, древние греки, древние египтяне тоже не было. Все они имели свои собственные "кодировки" и почти не уважали другие культуры. Все эти цивилизации рассыпались в прах. Подумайте об этом люди! Сделайте ваши приложения Unicode-aware, на благо человечества. :)
PS2 пожалуйста, не испортите предыдущее сообщение, сказав "Но китайцы...". Если вы чувствуете себя склонным или обязанным сделать это, однако, задержите его, думая, что BMP Unicode заполнен в основном китайскими идеограммами, ergo Chinese является основой Unicode. Я могу продолжать изобретать возмутительную ложь, пока люди разрабатывают приложения, ориентированные на Unicode. Ура!
кодирование доступно для строк unicode, но строка, которую вы там имеете, не кажется unicode (попробуйте с u'add \x93Monitoring\x93 to list ')
>>> u'add \x93Monitoring\x93 to list '.encode('latin-1','ignore') 'add \x93Monitoring\x93 to list '
возникает та же проблема; однако, возникли проблемы с пониманием того, как правильно включить синтаксис кодирования без создания дополнительных ошибок или недопустимой синтаксической ошибки.
genesis_block = { 'hash': hash_function({ 'block_number': 0, 'parent_hash': None, 'transaction_count': 1, 'transaction': [{'Tom': 10}] }), 'contents': { 'block_number': 0, 'parent_hash': None, 'transaction_count': 1, 'transaction': [{'Tom': 10}] }, } block_chain = [genesis_block] chain_state = {'Tom': 10}