Какой метод обработки ошибок лучше для декодирования байтов Python в строки Unicode? - PullRequest
0 голосов
/ 08 апреля 2010

У меня есть старая программа на C #, которая по разным причинам переносится на Python 3. По сути, программа выполняет выборку веб-сайта и поиск его содержимого (и его обработку, но это не очень актуально). У меня никогда не было проблем с самой процедурой выборки и поиска, но как только я перенес ее на Python, он начал жаловаться на недопустимый юникод в определенных местах.

Это на самом деле не проблема, поскольку фактические исходные данные веб-страницы такие же, как в старом приложении C #, и старая программа достигла своей цели с помощью поврежденных данных. Однако я хочу, чтобы метод Python 3 decode () вел себя так же, как и внутренняя обработка таких случаев в C #. К сожалению, после прочтения руководства по Python и изучения методов обработки ошибок «игнорировать» и «заменить» я действительно не понимаю, что лучше всего имитировать поведение C # (которое я также не смог определить).

Чтобы добавить некоторый код в обсуждение, вот код C #, который все обрабатывает прозрачно:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
response = (HttpWebResponse)request.GetResponse();
reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string html = reader.ReadToEnd();

Соответствующий код Python 3 выглядит следующим образом:

req = Request(url)
r = urlopen(req)
data = r.read().decode("utf_8")

Однако я хочу выяснить, какой из следующих фрагментов кода лучше всего имитирует поведение Unicode в коде C #:

data = r.read().decode("utf_8", "replace")

или

data = r.read().decode("utf_8", "ignore")

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

Заранее спасибо за любую помощь!

1 Ответ

2 голосов
/ 08 апреля 2010

Согласно http://msdn.microsoft.com/en-us/library/system.text.encoding.utf8.aspx стандартный декодер UTF-8 C # игнорирует недопустимые байты.

Параметр Python 'ignore' для декодирования Unicode такой же, как этот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...