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