UnicodeDecodeError: кодек 'utf8' не может декодировать байт 0x9c
У меня есть сервер сокетов, который должен получать действительные символы UTF-8 от клиентов.
Проблема заключается в том, что некоторые клиенты (в основном хакеры) отправляют через него все неправильные данные.
Я могу легко отличить подлинного клиента, но я регистрирую файлы всех отправленных данных, чтобы потом проанализировать их.
Иногда я получаю символы типа œ
, которые вызывают ошибку UnicodeDecodeError
.
Мне нужно сделать строку UTF-8 с этими символами или без них.
Update:
В моем конкретном случае служба сокетов была MTA, и поэтому я ожидаю получить команды ASCII, например:
EHLO example.com
MAIL FROM: <[email protected]>
...
Я записывал все это в JSON.
Тогда некоторые люди там без благих намерений решили продать все виды мусора.
Вот почему для моего конкретного случая вполне нормально снимать символы без ASCII.
Ответы
Ответ 1
http://docs.python.org/howto/unicode.html#the-unicode-type
str = unicode(str, errors='replace')
или же
str = unicode(str, errors='ignore')
Примечание: это удалит (проигнорирует) рассматриваемые символы, возвращая строку без них.
Для меня это идеальный случай, так как я использую его как защиту от ввода не-ASCII, что не разрешено моим приложением.
Альтернативно: используйте метод open из модуля codecs
чтобы прочитать в файле:
import codecs
with codecs.open(file_name, 'r', encoding='utf-8',
errors='ignore') as fdata:
Ответ 2
Этот тип проблемы возникает для меня сейчас, когда я перешел на Python 3. Я понятия не имел, что Python 2 просто пародировал любые проблемы с кодировкой файлов.
Я нашел это приятное объяснение различий и как найти решение после того, как ни одно из вышеперечисленных действий не было для меня.
http://python-notes.curiousefficiency.org/en/latest/python3/text_file_processing.html
Короче говоря, для того, чтобы Python 3 вел себя как можно ближе к Python 2, используйте:
with open(filename, encoding="latin-1") as datafile:
# work on datafile here
Однако, прочитайте статью, нет ни одного размера, подходящего для всего решения.
Ответ 3
Смена движка с C на Python сделала мой трюк.
Двигатель C:
pd.read_csv(gdp_path, sep='\t', engine='c')
Кодек utf-8 не может декодировать байт 0x92 в позиции 18: недопустимый начальный байт
Двигатель Python:
pd.read_csv(gdp_path, sep='\t', engine='python')
Нет ошибок для меня.
Ответ 4
>>> '\x9c'.decode('cp1252')
u'\u0153'
>>> print '\x9c'.decode('cp1252')
œ
Ответ 5
У меня была такая же проблема с UnicodeDecodeError
, и я решил ее с этой строкой.
Не знаю, лучший ли это, но это сработало для меня.
str = str.decode('unicode_escape').encode('utf-8')
Ответ 6
Просто в случае, если у кого-то такая же проблема. Я использую vim с YouCompleteMe, не удалось запустить ycmd с этим сообщением об ошибке, что я сделал: export LC_CTYPE="en_US.UTF-8"
, проблема в том, что ушел.
Ответ 7
Что вы можете сделать, если вам нужно внести изменения в файл, но не знаете кодировку файлов? Если вы знаете, что кодировка совместима с ASCII, и хотите проверять или изменять только части ASCII, вы можете открыть файл с помощью обработчика ошибок surrogateescape:
with open(fname, 'r', encoding="ascii", errors="surrogateescape") as f:
data = f.read()
Ответ 8
первый, используя get_encoding_type, чтобы получить тип файла кодирования:
import os
from chardet import detect
# get file encoding type
def get_encoding_type(file):
with open(file, 'rb') as f:
rawdata = f.read()
return detect(rawdata)['encoding']
во-вторых, открывая файлы с типом:
open(current_file, 'r', encoding = get_encoding_type, errors='ignore')
Ответ 9
фрагмент ошибки показан в этой ссылке, я также получаю подобную ошибку, и я не могу ее решить. Может кто-нибудь, пожалуйста, помогите мне с этой ошибкой. Это моя функция, которая дает ошибку enter code here
{#!/Usr/bin/python import imagereaderfromafolder запросы на импорт import base64 import json import cv2 import os import os.path import numpy as np из PIL import Image
def jason_return(folder):
images = []
for filename in os.listdir(folder):
img = cv2.imread(os.path.join(folder, filename),
flags=cv2.IMREAD_COLOR)
IMAGE_PATH = imagereaderfromafolder.rescale(img)
SECRET_KEY = 'sk_a5e2547cffc36e5eff2e8a13'
with open(IMAGE_PATH, 'rb') as image_file:
img_base64 = base64.b64encode(image_file.read())
url = 'https://api.openalpr.com/v2/recognize_bytes
recognize_vehicle=1&country=us&secret_key=%s' % (SECRET_KEY)
r = requests.post(url, data=img_base64)
y=json.dumps(r.json(), indent=2)
#print(json.dumps(r.json(), indent=2))
if img is not None:
images.append(img)
return y