Unicodedecodeerror: кодек ‘charmap’ не может декодировать байт 0x81 в позиции 55: символ отображается на

2 ответа

Лучший ответ

Трудно быть уверенным в том, что здесь происходит, потому что за сценой много кода, но сообщение об ошибке говорит о том, что во входном потоке есть недопустимый символ. Код x81 не определен в кодовой странице 1252, которая является действующей кодовой страницей. Это кодовая страница по умолчанию для Западной Европы и США. Программа пытается преобразовать предполагаемую строку кодовой страницы в Unicode, чтобы это не удалось.

Я предполагаю, что ввод на самом деле не закодирован с помощью cp 1252. Что-то напутано в текущей кодовой странице статистики или в режиме Unicode. Возможно, вам потребуется установить для локали SPSS Statistics что-то другое или включить или отключить режим Unicode. См. SET LOCALE и SET UNICODE в Справочнике по синтаксису команд, чтобы узнать, как это сделать.

Если вы сможете больше рассказать о своем языковом стандарте и о том, что делает этот код, мы могли бы предоставить больше информации.

1

JKP
29 Сен 2016 в 13:18

Во-первых, вот минимальный пример воспроизведения вашей ошибки в Windows:

Насколько я понимаю, проблема заключается в следующем (я собрал некоторую информацию и примеры, которые я нашел, но не уверен, что все правильно. Я приветствую исправления.)

  • Символ — это кодовая точка 252 = 0xfc в Юникоде, https: // таблица юникода .com / о / 00FC / ) .
  • Python correct передает символ на консоль, как вы можете проверить, используя этот пример (обязательно сохраните файл как UTF-8):

Я не уверен, почему это работает в первую очередь. (Этот ответ может быть следующим: https://stackoverflow.com/a/32176732/880783)

  • Консоль использует что-то еще, кроме Unicode, для внутреннего использования. Например, в таблице ASCII символ находится в позиции 129 = 0x81 (звуки знакомый?).
  • Поэтому, когда консоль возвращает этот символ, Python считает его кодовой точкой Unicode, но . Отсюда и ошибка.

Ключ в том, чтобы Python понимал, как кодируется то, что он получает от процесса. В моем примере (консоль Windows) я попробовал несколько кодировок (см. Список здесь.) вот так:

  • завершается с ошибкой (вероятно, не распространяется на расширенный ASCII).
  • не удается с
  • работает, но выводит символ коробки («) на моей консоли отладки в VS Code.
  • , кажется, работает, выводя символ .

Так что я буду придерживаться сейчас и посмотрю, как оно пойдет.

1

bers
15 Мар 2019 в 11:20

3 ответа

Лучший ответ

Хорошо, теперь я вижу проблему.

Какие изменения были сделаны и почему?

Обратите внимание, что цикл находится внутри блока , а не наоборот. Это необходимо сделать, потому что каждый раз, когда вы открываете файл в режиме , все данные, которые были в файле ранее, стираются (также как и в режиме )

Итак, мы открываем файл для записи только один раз. Это позволит вам накапливать данные из файлов, которые вы читаете (, что вы хотите сделать ). Параметр функции по умолчанию имеет значение (читать текст). Вы читаете двоичные данные, поэтому используйте режим . ( В других ответах эта точка зрения была правильной, но пропущенная точка № 1 ).

Palak Kumar Jha
26 Апр 2020 в 14:32

Вы открываете в текстовом режиме (по умолчанию), и Python пытается декодировать его с помощью кодировки, в которой не соответствует ни одному символу (это может быть CP1252, если вы на винде)

Поскольку вы хотите манипулировать двоичными данными, открыв в двоичном режиме, откройте также в двоичном режиме:

Thierry Lathuille
26 Апр 2020 в 14:09

Первый файл, который вы открыли, был открыт в режиме но второй файл, как он не был указан, был открыт в и происходит потому, что декодер не может преобразовать (понять) некоторые байты в строку в этом кодеке, поэтому для решения этого просто измените

К

Но если вы хотите скопировать файлы, я предлагаю вам использовать модуль shutil следующим образом:

n.qber
26 Апр 2020 в 14:13

Примеры

На следующей диаграмме вы можете увидеть, как слово был закодирован в кодировке «UTF-8» или «Cp1252» в зависимости от типа терминала. В обоих примерах это просто обычный ascii. В UTF-8 кодируется двумя байтами. В «Cp1252» равно 0xE9 (что также является значением точки Unicode (это не случайно)). Верное вызывается и преобразование в Unicode Python выполнено успешно:

На этой диаграмме называется с (что то же самое, что и вызов без указанной кодировки). Поскольку ASCII не может содержать байтов больше, чем , это вызовет исключение:

Сэндвич с Юникодом

Хорошей практикой является формирование сэндвича Unicode в вашем коде, где вы декодируете все входящие данные в строки Unicode, работаете с Unicodes, а затем кодируете в s на выходе. Это избавляет вас от беспокойства о кодировании строк в середине вашего кода.

13 ответов

Лучший ответ

Python пытается преобразовать байтовый массив (, который он принимает как строку в кодировке utf-8), в строку Unicode (). Этот процесс, конечно, является декодированием в соответствии с правилами utf-8. Когда он пытается это сделать, он встречает последовательность байтов, которая не разрешена в строках с кодировкой utf-8 (а именно, это 0xff в позиции 0).

Поскольку вы не предоставили никакого кода, на который мы могли бы взглянуть, мы могли только догадываться об остальном.

Из трассировки стека можно предположить, что инициирующим действием было чтение из файла (). Я предлагаю перекодировать это так:

То, что в спецификаторе режима в указывает, что файл должен рассматриваться как двоичный файл, поэтому останется . Попытка декодирования таким образом не произойдет.

243

Alfe
20 Ноя 2018 в 09:21

Если возможно, откройте файл в текстовом редакторе и попробуйте изменить кодировку на UTF-8. В противном случае сделайте это программно на уровне ОС.

-6

Manoj Joshi
13 Авг 2017 в 13:48

У меня похожая проблема. Я пытаюсь запустить пример в tenorflow / models /jective_detection и встретил то же сообщение. Попробуйте изменить Python3 на Python2

-5

user8665083
24 Сен 2017 в 14:06

У меня была похожая проблема.

Решил:

Однако у меня была другая проблема. Некоторые html-файлы (в моем случае) не были utf-8, поэтому я получил похожую ошибку. Когда я исключил эти HTML-файлы, все работало гладко.

Таким образом, кроме исправления кода, проверьте также файлы, из которых вы читаете, возможно, там действительно есть несовместимость.

Kostas Tsiligkiris
1 Ноя 2019 в 10:50

Проверьте путь к файлу для чтения. Мой код продолжал давать мне ошибки, пока я не изменил имя пути на текущий рабочий каталог. Ошибка была:

1

luchonacho
4 Июл 2017 в 16:05

Если вы получаете данные от последовательного порта, убедитесь, что вы используете правильную скорость передачи данных (и другие конфигурации): декодирование с использованием ( utf-8 ), но неправильная конфигурация вызовет ту же ошибку

Чтобы проверить конфигурацию вашего последовательного порта в Linux, используйте:

2

Saif Faidi
23 Май 2019 в 08:18

Это просто означает, что вы выбрали неправильную кодировку для чтения файла.

На Mac используйте , чтобы найти правильную кодировку. В Linux используйте .

3

Minh Triet
10 Ноя 2019 в 19:32

Если вы используете Mac, проверьте наличие скрытого файла .DS_Store. После удаления файла моя программа сработала.

3

Juan Navarrete
21 Янв 2019 в 19:49

Использовать только

Вместо того

4

Paul Roub
17 Июн 2018 в 14:14

Я столкнулся с этой веткой, когда столкнулся с той же ошибкой, после некоторого исследования, которое я могу подтвердить, это ошибка, которая возникает, когда вы пытаетесь декодировать файл UTF-16 с помощью UTF-8.

, которая используется в качестве подсказки для декодирования и не отображается в виде символа в декодированной строке. Это означает, что первый байт будет либо FE, либо FF, а второй — другим.

Сильно отредактировано после того, как я узнал реальный ответ

15

Peter Ogden
5 Дек 2017 в 08:37

Была проблема, похожая на эту, закончилась использованием UTF-16 для декодирования. мой код ниже.

Это взяло бы содержимое файла как импорт, но это возвратило бы код в формате UTF. оттуда это будет расшифровано и отделено линиями.

26

tattmoney76
16 Авг 2017 в 15:34

Используйте формат кодирования ISO-8859-1 , чтобы решить эту проблему.

29

Ramineni Ravi Teja
4 Июн 2019 в 20:04

Используйте это решение, оно удалит (проигнорирует) символы и вернет строку без них. Используйте это только если вам нужно раздеть их, а не конвертировать.

Используя Вы просто потеряете некоторых персонажей. но если вы не заботитесь о них, так как они кажутся лишними символами, происходящими из-за неправильного форматирования и программирования клиентов, подключающихся к моему серверу сокетов. Тогда это простое прямое решение.

101

Nitish Kumar Pal
1 Фев 2018 в 05:53

10 ответов

Лучший ответ

В рассматриваемом файле не используется кодировка . Он использует другую кодировку. Какой из них вы должны выяснить сами. Распространенными являются и . Поскольку 0x90 на самом деле ничего не означает в , более вероятно, что (где 0x90 — это байт продолжения).

Вы указываете кодировку при открытии файла:

1252

fat
5 Сен 2017 в 13:05

Для меня кодировка с utf16 работала

gabi939
21 Фев 2021 в 11:31

Для меня изменение кодировки символов Mysql так же, как мой код, помогло разобраться в решении. `photo = open (‘pic3.png’, encoding = latin1), сильный текст

Piyush raj
4 Фев 2020 в 05:45

Прежде чем применить предложенное решение, вы можете проверить, какой символ Юникода появился в вашем файле (и в журнале ошибок), в данном случае : (или непосредственно на сайте Консорциума Unicode http://www.unicode.org/charts/ путем поиска )

А затем рассмотрите возможность удаления его из файла.

1

hanna
6 Авг 2020 в 16:29

Для тех, кто работает в Anaconda в Windows, у меня была такая же проблема. Notepad ++ помог мне решить эту проблему.

Откройте файл в Notepad ++. В правом нижнем углу отображается текущая кодировка файла. В верхнем меню рядом с «Просмотр» найдите «Кодировка». В «Кодировке» перейдите в «Наборы символов» и там с терпением найдите нужное вам закрепление. В моем случае кодировка «Windows-1252» была найдена в «Западноевропейской».

2

Antoni
1 Сен 2019 в 05:36

Не тратьте время зря, просто добавьте следующие и в свой код как при чтении, так и при записи:

Счастливого пути

8

E.Zolduoarrati
1 Июн 2020 в 21:54

TL; DR? Попробуйте:

Почему? При однократном использовании:

Python предполагает, что файл использует ту же кодовую страницу, что и текущая среда (cp1252 в случае вводного сообщения), и пытается декодировать его в свой собственный UTF-8 по умолчанию. Если файл содержит символы значений, не определенных в этой кодовой странице (например, 0x90), мы получаем UnicodeDecodeError. Иногда мы не знаем кодировку файла, иногда кодировка файла может не обрабатываться Python (например, cp790), иногда файл может содержать смешанные кодировки.

Если такие символы не нужны, их можно заменить вопросительными знаками:

Другой обходной путь — использовать:

После этого символы остаются нетронутыми, но другие ошибки также будут замаскированы.

Неплохое решение — указать кодировку, но не кодировку (например, cp1252), а ту, в которой определены ВСЕ символы (например, cp437):

18

rha
8 Ноя 2019 в 18:14

В качестве альтернативы, если вам не нужно декодировать файл, например, загружая файл на веб-сайт,

Где r = чтение , b = двоичный

27

Barbaros Özhan
4 Окт 2020 в 12:53

В качестве расширения к ответу @ LennartRegebro:

Если вы не можете сказать, какая кодировка используется в вашем файле, а указанное выше решение не работает (это не ) и вы просто догадываетесь — есть онлайн-инструменты, которые можно использовать для определения того, что это за кодировка. Они не идеальны, но обычно работают нормально. После того, как вы определитесь с кодировкой, вы сможете использовать решение, указанное выше.

РЕДАКТИРОВАТЬ: (скопировано из комментария)

В довольно популярном текстовом редакторе есть команда для отображения кодировки, если она была установлена ​​…

  1. Перейдите к -> (или Ctrl + `)

  1. Введите в поле внизу и надейтесь на лучшее (я не смог получить ничего, кроме , но, возможно, вам повезет больше …)

37

Stevoisiak
9 Сен 2019 в 19:25

Если не работает, попробуйте , если вы хотите удалить ненужные символы. (документы)

69

Ben
9 Июн 2021 в 02:03

Python 3

Python 3 не более Unicode способен, чем Python 2.x, однако он немного менее запутан в теме. Например, обычное теперь является строкой Unicode, а старое теперь .

По умолчанию используется кодировка UTF-8, поэтому, если вы байтовой строки не указали кодировку, Python 3 использует кодировку UTF-8. Это, вероятно, решает 50% проблем Unicode людей.

Кроме того, по умолчанию работает в текстовом режиме, поэтому возвращает декодированное (Unicode). Кодировка получена из вашей локали, которая имеет тенденцию быть UTF-8 в системах Un * x или 8-битной кодовой страницей, такой как windows-1251, в блоках Windows.

8 ответов

Лучший ответ

В двоичном коде 0xE9 выглядит как . Если вы прочитаете о , вы увидите, что такой за байтом должны следовать два вида . Так, например:

Но это только механическая причина исключения. В этом случае у вас есть строка, которая почти наверняка закодирована в латинском 1. Вы можете увидеть, как UTF-8 и латинский 1 выглядят по-разному:

(Обратите внимание, что я использую смесь представлений Python 2 и 3. Здесь ввод действителен в любой версии Python, но ваш интерпретатор Python вряд ли на самом деле будет отображать строки как в Юникоде, так и в байтах)

230

Josh Lee
5 Апр 2017 в 16:56

В этом случае я попытался выполнить .py, который активен путь / file.sql.

Мое решение состояло в том, чтобы изменить кодификацию файла.sql на «UTF-8 без спецификации», и это работает!

Вы можете сделать это с помощью Notepad ++.

Я оставлю часть моего кода.

/ код /

Con = psycopg2.connect (host = sys.argv , port = sys.argv , dbname = sys.argv , user = sys.argv , пароль = sys.argv )

Cursor = con.cursor () sqlfile = open (путь, ‘r’)

-1

Martin Taco
19 Июн 2019 в 21:26

Это недействительный UTF-8. Этот символ является острым символом в ISO-Latin1, поэтому он успешно работает с этим набором кодов.

Если вы не знаете кодовый набор, в который вы получаете строки, у вас возникли проблемы. Было бы лучше, если для вашего протокола / приложения был бы выбран один кодовый набор (надеюсь, UTF-8), и тогда вы просто отклонили бы те, которые не были декодированы.

Если вы не можете этого сделать, вам понадобится эвристика.

58

Sami J. Lehtinen
5 Апр 2011 в 13:35

Ошибка кода utf-8 обычно возникает, когда диапазон числовых значений превышает от 0 до 127.

Причина поднять это исключение:

1) Если кодовая точка

Чтобы преодолеть это, у нас есть набор кодировок, наиболее широко используемым является «Latin-1, также известный как ISO-8859-1»

Таким образом, точки Unicode ISO-8859-1 0–255 идентичны значениям Latin-1, поэтому преобразование в эту кодировку просто требует преобразования кодовых точек в байтовые значения; если кодовая точка больше 255, строка не может быть закодирована в Latin-1

Когда это исключение возникает, когда вы пытаетесь загрузить набор данных, попробуйте использовать этот формат

Добавьте метод кодирования в конце синтаксиса, который затем принимает для загрузки набора данных.

1

HK boy
18 Янв 2020 в 17:20

Потому что UTF-8 является многобайтовым и нет символа, соответствующего вашей комбинации плюс следующий пробел.

Почему он должен преуспевать в и utf-8, и в latin-1?

Вот как должно быть то же предложение в utf-8:

44

neurino
5 Апр 2011 в 13:28

Если эта ошибка возникает при манипулировании файлом, который был только что открыт, проверьте, открыли ли вы его в режиме

10

Patrick Mutuku
4 Июл 2018 в 23:09

Это также случилось со мной, когда я читал текст, содержащий иврит, из файла .

Я нажал: и сохранил этот файл в кодировке

4

Alon Gouldman
21 Фев 2019 в 07:53

У меня была такая же ошибка, когда я пытался открыть файл CSV с помощью метода pandas read_csv.

Решением было изменить кодировку на ‘latin-1’:

210

Brad Larson
8 Окт 2015 в 18:13

для King & Country \ «Dreamers \» (официальный концерт в зале)

Как это исправить?

В некоторых других приложениях для статических блогов на основе Python публикация на китайском языке может быть успешно опубликована. Например, это приложение: http://github.com/vrypan/bucket3. На моем сайте http://bc3.brite.biz/ можно успешно опубликовать китайский пост.

возможный дубликат UnicodeDecodeError: кодек ascii не может декодировать байт 0xe2 в позиции 13: порядковый номер не в диапазоне (128)

tl; dr / быстрое исправление

  • Не декодируйте / не кодируйте волей-неволей
  • Не предполагайте, что ваши строки закодированы в UTF-8
  • Постарайтесь как можно скорее преобразовать строки в строки Unicode в своем коде
  • Исправьте вашу локаль: как решить UnicodeDecodeError в Python 3.6?
  • Не поддавайтесь соблазну использовать быстро хаки

Unicode Zen в Python 2.x — длинная версия

Не видя источника, трудно понять основную причину, поэтому мне придется говорить в целом.

обычно происходит, когда вы пытаетесь преобразовать Python 2.x который содержит строку Unicode, отличную от ASCII, без указания кодировки исходной строки.

Короче говоря, строки Unicode — это совершенно отдельный тип строки Python, не содержащий никакой кодировки. Они поддерживают только Юникод коды точек и поэтому может содержать любую точку Unicode из всего спектра. Строки содержат закодированный текст, beit UTF-8, UTF-16, ISO-8895-1, GBK, Big5 и т. Д. Строки декодируются в Unicode а также Юникоды кодируются в строки. Файлы и текстовые данные всегда передаются в виде закодированных строк.

Авторы модуля Markdown, вероятно, используют (где выбрасывается исключение) в качестве ворот качества для остальной части кода — он преобразует ASCII или повторно переносит существующие строки Unicodes в новую строку Unicode. Авторы Markdown не могут знать кодировку входящей строки, поэтому будут полагаться на то, что вы декодируете строки в строки Unicode перед переходом в Markdown.

Строки Unicode могут быть объявлены в вашем коде с помощью префикс к строкам. Например.

Строки Unicode также могут поступать из файлов, баз данных и сетевых модулей. Когда это произойдет, вам не нужно беспокоиться о кодировке.

Попался

Преобразование из в Unicode может произойти, даже если вы явно не вызываете .

Следующие сценарии вызывают исключения:

Юникод сэндвич

Хорошей практикой является формирование сэндвича Unicode в вашем коде, где вы декодируете все входящие данные в строки Unicode, работаете с Unicodes, а затем кодируете в s на выходе. Это избавляет вас от беспокойства о кодировании строк в середине вашего кода.

Ввод/Декодирование

Исходный код

Если вам нужно добавить не-ASCII в ваш исходный код, просто создайте строки Unicode, добавив префикс . Например.

Чтобы позволить Python декодировать исходный код, вам необходимо добавить заголовок кодирования, соответствующий фактической кодировке вашего файла. Например, если ваш файл был закодирован как UTF-8, вы должны использовать:

Это необходимо только в том случае, если в исходном коде есть код (не = ASCII) .

Обычно не-ASCII данные получаются из файла. Модуль предоставляет TextWrapper, который декодирует ваш файл на лету, используя заданное . Вы должны использовать правильную кодировку для файла — это не может быть легко угадано. Например, для файла UTF-8:

Тогда будет подходящим для перехода к Markdown. Если из строки , то вы, вероятно, использовали неправильное значение кодировки.

Модуль Python 2.7 CSV не поддерживает символы не ASCII ????. Однако помощь под рукой: https://pypi.python.org/pypi/backports.csv .

Используйте его как выше, но передайте ему открытый файл:

Базы данных

Большинство драйверов баз данных Python могут возвращать данные в Unicode, но обычно требуют небольшой настройки. Всегда используйте строки Unicode для запросов SQL.

В строке подключения добавьте:

Например.

Добавлять:

HTTP

Веб-страницы могут быть закодированы практически в любой кодировке. Заголовок должен содержать поле для указания на кодировку. Затем содержимое может быть декодировано вручную в соответствии с этим значением. В качестве альтернативы Python-Requests возвращает Unicodes в .

Вручную

Если вам необходимо декодировать строки вручную, вы можете просто выполнить , где — подходящая кодировка. Python 2.x поддерживаемые кодеки приведены здесь: . Опять же, если вы получите , значит, вы, вероятно, ошиблись кодировкой.

Результат

стандартный вывод/печать

пишет через поток stdout. Python пытается настроить кодировщик на стандартный вывод, чтобы Unicodes кодировались в кодировку консоли. Например, если оболочки Linux — , выходные данные будут закодированы в . В Windows вы будете ограничены 8-битной кодовой страницей.

Неправильно настроенная консоль, например поврежденная локаль, может привести к неожиданным ошибкам печати. Переменная окружения может форсировать кодирование для stdout.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: