Пользователь пока ничего не рассказал о себе

Наибольший вклад в теги

Все теги (1)

Лучшие ответы пользователя

Все ответы (2)
  • Python, проблема?

    buriy
    @buriy
    В Windows (включая Win7):
    >>> import sys
    >>> print sys.stdin.encoding
    cp866
    >>> print sys.stdout.encoding
    cp866
    


    Данная кодировка — это особенность виндового cmd.

    Поэтому

    print link_text.encode('cp866','replace')
    
    даст в cp866 консоли русский текст, заменяя юникодные символы, которых нет в этой кодировке, на вопросик ("?").
    При попытке вывести юникод, данная конверсия, но без замены плохих символов, запустится самостоятельно, и сломается, потому что там присутствуют символы, которые не могут быть представлены в cp866.
    Как же найти эти символы?
    >>> t=link_text.encode('cp866','replace').decode('cp866')
    >>> for i in xrange(len(t)):
    >>>      if link_text[i:i+1] != t[i:i+1]: link_text[i:i+1]
    >>>
    u'\xea'
    u'\xab'
    u'\xbb'
    u'\xea'
    u'\xea'
    u'\xea'
    u'\xea'
    u'\xea'
    u'\xea'
    u'\xea'
    u'\xea'
    u'\xea'
    u'\u2014'
    >>> import htmlentitydefs
    >>> for i in xrange(len(t)):
    >>>     if link_text[i:i+1] != t[i:i+1]: htmlentitydefs.codepoint2name[ord(link_text[i:i+1])]
    >>> 
    'ecirc'
    'laquo'
    'raquo'
    'ecirc'
    'ecirc'
    'ecirc'
    'ecirc'
    'ecirc'
    'ecirc'
    'ecirc'
    'ecirc'
    'ecirc'
    'mdash'
    

    В общем, как обычно — html entities.

    Аналогичные проблемы могут быть в линуксе, при использовании не-utf8 консоли.
    Например:
    <source lang=«python>
    >>> import sys
    >>> sys.stdin.encoding
    'KOI8-R'
    >>> sys.stdout.encoding
    'KOI8-R'
    >>> e='привет'
    >>> e
    '\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'
    >>> print e
    привет
    >>> e.decode('koi8-r') #добавил пробелы после каждой \u, для защиты от хабрапарсера
    u'\u 043f\x a9\u 044f\u 2500\u 043f\u 2566\u 043f\u 2561\u 043f\u 2563\u 044f\u 250c'
    >>> print e.decode('koi8-r')
    привет


    Как видите, при выводе уникода print конвертирует его в кодировку консоли, а при выводе не-юникода print выводит байты „как есть“.
    Ответ написан
    Комментировать