Ошибка «ASCII» в Unicode в python при попытке прочитать строку в кодировке latin-1

У меня возникла проблема при попытке применить регулярное выражение к некоторым строкам, закодированным в латинице-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 (не -breaking space) и отправляется на сервер. По какой-то причине мой скрипт не интерпретирует этот символ как пробел и не соответствует ему. Согласно python [документация] [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, хотя я явно передаю другой кодек?


person Simon    schedule 19.02.2010    source источник
comment
Вы должны отметить одно из этих решений как принятое, если они ответили на ваш вопрос.   -  person John La Rooy    schedule 19.02.2010
comment
спасибо, как n00b, я продолжаю искать кнопку «принято» или «отвечено» прошлой ночью, но ничего не нахожу. немного больше подталкивания привело к тому, что я обнаружил галочку.   -  person Simon    schedule 19.02.2010


Ответы (2)


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

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

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

person John Machin    schedule 19.02.2010
comment
Ага, 2.6- спасибо за технику repr(). Re: исходная проблема - re.UNICODE была хитростью - СПАСИБО! - person Simon; 19.02.2010

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

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

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

person Laurence Gonsalves    schedule 19.02.2010
comment
+1, но обратите внимание, что это полезно сейчас, но не глобально. Вам лучше начать немного изучать кодирование, если вы хотите избежать этих проблем. - person e-satis; 19.02.2010
comment
Я не уверен, что понимаю вашу точку зрения - полезно было понять, что print() будет неявно преобразовываться в кодировку по умолчанию. - person Simon; 19.02.2010