Лучшие практики для 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 не приведет вас слишком далеко.

Другие вопросы по тегам