Лучшие практики для Python UnicodeDecodeError - PullRequest
5 голосов
/ 14 октября 2010

Я использую Pylons framework, Mako шаблон для веб-приложения. Я не особо задумывался над тем, как Python обрабатывает строки в юникоде. У меня был напряженный момент, когда я видел сбой моего сайта при отображении страницы, и позже я узнал, что она связана с UnicodeDecodeError .

Увидев ошибку, я начал мешать свой код Python, добавив кодирование, декодирование вызовов для строки с параметром «игнорировать», но все же я не мог видеть, что ошибки когда-то исчезли.

Наконец я использовал для декодирования в ascii игнорирование и заставил сайт работать без сбоев.

Вход на мой сайт происходит через множество сайтов. Это означает, что я не контролирую языки или язык по выбору. Мой сайт поддерживает международные языки, а также английский. У меня есть агрегация фидов, которая обычно не беспокоит насчет unicode / ascii / utf-8. Пока я отображаю текст через мако шаблон, я показываю как есть.

Не будучи веб-экспертом, Каковы лучшие практики для обработки строк в проекте Python? Должен ли я заботиться только о визуализации текста или всей фазы приложения?

Ответы [ 2 ]

11 голосов
/ 14 октября 2010

Если вы на это влияете, то это безболезненный путь:

  • знает вашу входную кодировку (или декодирует с игнорированием) и decode(encoding) данные, как только они попадают в ваше приложение
  • внутренне работает только с Unicode (u'something' Unicode), также в базе данных
  • для рендеринга, экспорта и т. Д., Каждый раз, когда он покидает ваше приложение, encode('utf-8') данные
2 голосов
/ 14 октября 2010

это не может быть приемлемым вариантом для вас, но позвольте мне сказать, что большое количество ошибок, связанных с кодировкой, исчезает при использовании Python 3, просто потому, что разделение между строками Unicode и байтовыми объектами стало намного понятнее.Когда мне нужно использовать 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 не приведет вас слишком далеко.

...