Лучшие практики для Python UnicodeDecodeError
Я использую Pylons Framework, шаблон Mako для веб-приложения. Я не особо задумывался над тем, как Python обрабатывает строки в юникоде. У меня был напряженный момент, когда я видел сбой моего сайта при рендеринге страницы, и позже я узнал, что она связана с UnicodeDecodeError.
Увидев ошибку, я начал мешать свой код Python, добавив кодирование, декодирование вызовов для строки с опцией "игнорировать", но все же я не мог видеть, что ошибки когда-то исчезли.
Наконец я использовал для декодирования в ascii с игнором и сделал сайт работает без сбоев.
Вход на мой сайт происходит через множество сайтов. Это означает, что я не контролирую языки или язык по выбору. Мой сайт поддерживает международные языки, а также английский. У меня есть агрегация каналов, которая обычно не беспокоит насчет Unicode/ ASCII / UTF-8. Пока я отображаю текст через шаблон мако, я показываю как есть.
Не будучи веб-экспертом, каковы лучшие практики для обработки строк в проекте Python? Должен ли я заботиться только о визуализации текста или на всех этапах приложения?
2 ответа
Если у вас есть влияние на это, это безболезненный путь:
- знать вашу входную кодировку (или декодировать с игнорированием) и
decode(encoding)
данные, как только оно попадает в ваше приложение - работать внутренне только с юникодом (
u'something'
это Unicode), также в базе данных - для рендеринга, экспорта и т. д., каждый раз, когда он покидает ваше приложение,
encode('utf-8')
данные
Это может быть нереальным вариантом для вас, но позвольте мне сказать, что большое количество ошибок, связанных с кодировкой, исчезает при использовании Python 3 только потому, что разделение между строками юникода и байтовыми объектами стало намного понятнее. когда мне нужно использовать Python 2, я выбираю версию 2.6, где вы можете объявить from future import unicode_literals
, неверующие должны прочесть ссылку, которую вы опубликовали, поскольку она указывает на некоторые тонкости поведения en/decoding в Python, которые, к счастью, исчезли в Python 3.
ты говоришь
Я не контролирую языки или язык по выбору. Мой сайт поддерживает международные языки, а также английский. У меня есть агрегация фидов, которая обычно не беспокоит насчет Unicode/ ASCII / UTF-8
Что бы вы ни делали, ясно, что вы не хотите, чтобы ваше веб-приложение аварийно завершало работу, просто потому, что некоторые блогигеры, чьи каналы вы используете, решили закодировать свои посты в неясной скандинавской схеме кодирования. основная проблема актуальна для всех веб-приложений, поскольку URL-адреса не содержат кодирующей информации, а также потому, что вы никогда не знаете, какие последовательности байтов злоумышленник может захотеть вам отправить. в этом случае я делаю то, что я называю "безопасное цепное декодирование": сначала я пытаюсь декодировать как utf-8, и если это не получится, попробуйте снова, используя cp1252. если это не удается, я отклоняю запрос (HTTP 404) или что-то подобное.
Вы упоминаете, что обрабатываете каналы, а вы? ¿Каналы? не беспокойтесь о юникоде и кодировках. не могли бы вы уточнить это утверждение? это полностью уклоняет меня от того, как можно успешно создать сайт, на котором есть текст на нескольких языках и не заботятся о кодировках. ясно, что использование ascii-only не приведет вас слишком далеко.