Ошибка «ASCII» в Unicode в python при попытке прочитать строку в кодировке латиницы-1 - PullRequest
1 голос
/ 19 февраля 2010

У меня проблема при попытке применить регулярное выражение к некоторым строкам, закодированным в латинице-1 (ISO-8859-1).

То, что я пытаюсь сделать, это отправить некоторые данные через HTTP POST со страницы, кодированной в ISO-8859-1, в мое приложение python и выполнить синтаксический анализ данных с помощью регулярных выражений в моем скрипте python.

Веб-страница использует jQuery для отправки данных на сервер, и я извлекаю текст со страницы, используя метод .text(). Как только данные отправляются обратно на сервер, они выглядят так: re.compile(r"^[\s,]*(\d*\s*\d*\/*\d)[\s,]*") - К сожалению, \s в моем регулярном выражении не соответствует моим данным, и я проследил проблему до того факта, что html-страница использует  , что кодируется в 0xA0 (неразрывный пробел) и отправляется на сервер. Кажется, по какой-то причине мой сценарий не интерпретирует этот символ как пробел и не соответствует. Согласно питону [документация] [1] похоже, что это должно работать, поэтому у меня должна быть проблема с кодировкой.

Затем я хотел попробовать преобразовать строку в юникод и передать ее в регулярное выражение, поэтому я попытался посмотреть, что произойдет, когда я преобразовал строку: print(unicode(data, 'iso-8859-1')).

К сожалению, я получил эту ошибку: UnicodeEncodeError at /script/ 'ascii' codec can't encode character u'\xa0' in position 122: ordinal not in range(128)

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

Ответы [ 2 ]

2 голосов
/ 19 февраля 2010

Попробуйте вместо этого:

print(repr(unicode(data, 'iso-8859-1')))

печатая объект Unicode, вы неявно пытаетесь преобразовать его в кодировку по умолчанию, то есть ASCII. Использование repr выведет его в ASCII-безопасную форму, плюс вам будет проще выяснить, что происходит для отладки.

1 голос
/ 19 февраля 2010

Вы используете Python 3.X или 2.X? Это имеет значение. На самом деле выглядит как 2.X, но вы смутили меня, используя печать (бла): -)

Ответ на ваш последний вопрос: Да, ASCII по умолчанию, когда вы делаете print(). На 3.X: используйте print(ascii(foo)) для отладки, а не print(foo). На 2.X используйте repr(), а не ascii().

Ваша первоначальная проблема с пространством без перерывов должна исчезнуть, если (a) данные имеют Unicode и (b) вы используете флаг re.UNICODE с re.compile ()

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