У меня есть сервер сокетов, который должен принимать действительные символы UTF-8 от клиентов.
Проблема в том, что некоторые клиенты (в основном хакеры) отправляют через них все неправильные данные.
Я могу легко отличить подлинного клиента, но я записываю в файлы все отправленные данные, чтобы потом проанализировать их.
Иногда я получаю такие символы, œ
которые вызывают UnicodeDecodeError
ошибку.
Я должен быть в состоянии сделать строку UTF-8 с или без этих символов.
Обновить:
В моем конкретном случае служба сокетов была MTA, и поэтому я ожидаю только получения команд ASCII, таких как:
EHLO example.com
MAIL FROM: <john.doe@example.com>
...
Я записывал все это в формате JSON.
Тогда некоторые люди без добрых намерений решили продать все виды мусора.
Вот почему для моего конкретного случая вполне нормально удалить символы, не входящие в ASCII.
источник
Ответы:
http://docs.python.org/howto/unicode.html#the-unicode-type
или
Примечание. Это приведет к удалению (игнорированию) рассматриваемых символов, возвращая строку без них.
Для меня это идеальный случай, так как я использую его как защиту от ввода не-ASCII, что не разрешено моим приложением.
Альтернативно: используйте метод open из
codecs
модуля, чтобы прочитать в файле:источник
str.decode('cp1252').encode('utf-8')
'\xc0msterdam'
котороеu'\ufffdmsterdam'
заменяется на replaceopen(file_name, "rb")
и затем примените подход Бена из комментариев вышеСмена движка с C на Python сделала мой трюк.
Двигатель C:
Двигатель Python:
Нет ошибок для меня.
источник
Этот тип проблем возникает у меня сейчас, когда я перешел на Python 3. Я понятия не имел, что Python 2 просто обрабатывает любые проблемы с кодировкой файлов.
Я нашел это хорошее объяснение различий и того, как найти решение после того, как ничего из вышеперечисленного не помогло мне.
http://python-notes.curiousefficiency.org/en/latest/python3/text_file_processing.html
Короче говоря, чтобы заставить Python 3 вести себя как можно ближе к использованию Python 2:
Тем не менее, прочитайте статью, там не один размер подходит для всех решений.
источник
источник
used by default in the legacy components of Microsoft Windows in English and some other Western languages
У меня была
UnicodeDecodeError
такая же проблема, и я решил ее с этой строкой. Не знаю, если это лучший способ, но это сработало для меня.источник
первый, используя get_encoding_type, чтобы получить тип файла кодирования:
во-вторых, открывая файлы с типом:
источник
На всякий случай у кого-то такая же проблема. Я использую vim с YouCompleteMe , мне не удалось запустить ycmd с этим сообщением об ошибке, что я и сделал:
export LC_CTYPE="en_US.UTF-8"
проблема исчезла.источник
export LC_CTYPE="en_US.UTF-8"
?Что вы можете сделать, если вам нужно внести изменения в файл, но вы не знаете кодировку файла? Если вы знаете, что кодировка совместима с ASCII и хотите проверять или изменять только части ASCII, вы можете открыть файл с помощью обработчика ошибок surrogateescape:
источник
Я решил эту проблему, просто добавив
источник