Форум сайта python.su
Получаю сообщения с imap сервера, получается вот такая строка:
em =u'\xd0\x9e\xd0\xb1\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xb8\xd0\xb5 \xd0\xb0\xd1\x80\xd0\xb5\xd0\xbd\xd0\xb4\xd1\x8b<br><br>\xd0\x9e\xd0\xb1\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xbe \xd0\xbe\xd0\xb1\xd1\x8a\xd0\xb5\xd0\xba\xd1\x82\xd0\xbe\xd0\xb2: 45<br>\xd0\x94\xd0\xb0\xd1\x82\xd0\xb0 \xd0\xbe\xd0\xb1\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8f: 14.05.2013 15:47:02<br><br>=============================================================<br>\xd0\xad\xd1\x82\xd0\xbe \xd0\xbf\xd0\xb8\xd1\x81\xd1\x8c\xd0\xbc\xd0\xbe \xd1\x81\xd0\xb3\xd0\xb5\xd0\xbd\xd0\xb5\xd1\x80\xd0\xb8\xd1\x80\xd0\xbe\xd0\xb2\xd0\xb0\xd0\xbd\xd0\xbe \xd0\xb0\xd0\xb2\xd1\x82\xd0\xbe\xd0\xbc\xd0\xb0\xd1\x82\xd0\xb8\xd1\x87\xd0\xb5\xd1\x81\xd0\xba\xd0\xb8 \xd0\xb8 \xd0\xbe\xd1\x82\xd0\xb2\xd0\xb5\xd1\x82\xd0\xb0 \xd0\xbd\xd0\xb5 \xd1\x82\xd1\x80\xd0\xb5\xd0\xb1\xd1\x83\xd0\xb5\xd1\x82.\r\n'
Ðбновление аÑендÑ<br><br>Ðбновлено обÑекÑов: 45<br>ÐаÑа обновлениÑ: 14.05.2013 15:47:02<br><br>=============================================================<br>ÐÑо пиÑÑмо ÑгенеÑиÑовано авÑомаÑиÑеÑки и оÑвеÑа не ÑÑебÑеÑ.
Офлайн
Если убрать u перед строкой, то все хорошо. Как можно решить такую проблему?Убрать u перед строкой.
Офлайн
pablodiguerero
Покажи код, где получаешь эту строку.
Офлайн
>>> em = u'\xd0\x9e\xd0\xb1\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xb8\xd0\xb5 \xd0\xb0\xd1\x80\xd0\xb5\xd0\xbd\xd0\xb4\xd1\x8b<br><br>\xd0\x9e\xd0\xb1\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xbe \xd0\xbe\xd0\xb1\xd1\x8a\xd0\xb5\xd0\xba\xd1\x82\xd0\xbe\xd0\xb2: 45<br>\xd0\x94\xd0\xb0\xd1\x82\xd0\xb0 \xd0\xbe\xd0\xb1\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8f: 14.05.2013 15:47:02<br><br>=============================================================<br>\xd0\xad\xd1\x82\xd0\xbe \xd0\xbf\xd0\xb8\xd1\x81\xd1\x8c\xd0\xbc\xd0\xbe \xd1\x81\xd0\xb3\xd0\xb5\xd0\xbd\xd0\xb5\xd1\x80\xd0\xb8\xd1\x80\xd0\xbe\xd0\xb2\xd0\xb0\xd0\xbd\xd0\xbe \xd0\xb0\xd0\xb2\xd1\x82\xd0\xbe\xd0\xbc\xd0\xb0\xd1\x82\xd0\xb8\xd1\x87\xd0\xb5\xd1\x81\xd0\xba\xd0\xb8 \xd0\xb8 \xd0\xbe\xd1\x82\xd0\xb2\xd0\xb5\xd1\x82\xd0\xb0 \xd0\xbd\xd0\xb5 \xd1\x82\xd1\x80\xd0\xb5\xd0\xb1\xd1\x83\xd0\xb5\xd1\x82.\r\n' >>> >>> out = em.encode('latin1').decode('utf-8') >>> print out Обновление аренды<br><br>Обновлено объектов: 45<br>Дата обновления: 14.05.2013 15:47:02<br><br>=============================================================<br>Это письмо сгенерировано автоматически и ответа не требует. >>>
Офлайн
py.user.next
Почему Unicode из latin1 так странно выглядит?
>>> 'фывфыв'.decode('latin1') u'\xd1\x84\xd1\x8b\xd0\xb2\xd1\x84\xd1\x8b\xd0\xb2' >>> 'фывфыв'.decode('utf-8') u'\u0444\u044b\u0432\u0444\u044b\u0432'
Офлайн
Потому что string - это набор байт.
Если вы попробуете в питоновском шелле написать эту строку на windows и linux, то получите разный результат:
ActivePython 2.7.2.5 (ActiveState Software Inc.) based on Python 2.7.2 (default, Jun 24 2011, 12:21:10) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> print 'фыв'.decode('latin1').__repr__() u'\xe4\xeb\xa2' >>>
Python 2.7.3 (default, Mar 13 2014, 11:03:55) [GCC 4.7.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> print 'фыв'.decode('latin1').__repr__() u'\xd1\x84\xd1\x8b\xd0\xb2' >>>
>>> print u'фыв'.encode('cp866').__repr__() '\xe4\xeb\xa2' >>> print u'фыв'.encode('utf-8').__repr__() '\xd1\x84\xd1\x8b\xd0\xb2' >>>
'фыв'.decode('latin1')
>>> print sys.stdin.encoding cp866 >>> u'фыв'.encode(sys.stdin.encoding).decode('latin1') u'\xe4\xeb\xa2' >>>
>>> print sys.stdin.encoding UTF-8 >>> u'фыв'.encode(sys.stdin.encoding).decode('latin1') u'\xd1\x84\xd1\x8b\xd0\xb2' >>> u'фыв'.encode(sys.stdin.encoding).decode('utf-8') u'\u0444\u044b\u0432' >>>
Отредактировано GreyZmeem (Сен. 11, 2014 12:13:02)
Офлайн
Во втором питоне:
>>> '\xd1\x84' '\xd1\x84' >>> print '\xd1\x84' ф >>>
>>> u'\u0444' u'\u0444' >>> print u'\u0444' ф >>>
>>> u'\xd1\x84'.encode('latin1') '\xd1\x84' >>>
>>> u'ф'.encode('utf-8') '\xd1\x84' >>> u'\u0444'.encode('utf-8') '\xd1\x84' >>>
Офлайн
GreyZmeemЭто всем известно.
Потому что string - это набор байт.
py.user.nextНо отображает как набор байтов. В этом вопрос.
Он берёт байт и преобразует его в соответствующую кодовую точку.
py.user.nextВижу что непростая.
Кодировка latin1 не простая
py.user.nextТеже самые символы в той же самой последовательности?
она полностью совпадает с началом юникода (256 кодовых точек)
py.user.nextДак если latin1 перевели в Unicode, он должен быть записан символами Unicode, а не набором байт.
Поэтому обратное преобразование выглядит как переделывание unicode строки в bytes строку.
Отредактировано Budulianin (Сен. 11, 2014 13:46:57)
Офлайн
BudulianinДа, я вас не правильно понял. Вы хотели узнать почему \xd1 не записывает как \u00d1.
Вопрос был в другом. Unicode это стандарт, в соответствии с которым, каждому символу определён код типа \u0444. Мне непонятно, почему для latin1 показывает набор байт, а не набор Unicode символов.
Офлайн
>>> print u'\xd1\x8b\xd0\xb2\xd0\xb0\xd1\x84\xd1\x8b\xd0\xb2' ÑваÑÑв >>> print u'\u00d1\u008b\u00d0\u00b2\u00d0\u00b0\u00d1\u0084\u00d1\u008b\u00d0\u00b2' ÑваÑÑв
>>> 'xyz'.decode('latin1')
u'xyz'
>>> 'xyz'.decode('latin1') u'xyz'
Офлайн