Опасаться funny characters

Предыстория

Во время написания iКучи я столкнулся с несовершенством мира. У меня появилась такая задача: по ссылке узнать title страницы. Теоретически, задача не сложная, но проявились нюансы, связанные с кодировками.

Чтобы сразу проверять работу парсера, я тестировал все в консоли. И иногда print вылетал с UnicodeEncodeError. Это явление известно как funny characters.

Пример

  • символ ‘ы’ имеет код U+044B
  • символ ‘©’ имеет код U+00A9
    >>> a = u'ы'
    >>> a
    u'\u044b'
    >>> b = u'\u00a9'
    >>> b
    u'\xa9'

Пробуем напечатать:

    >>> print a
    ы
    >>> print b
    ...
    UnicodeEncodeError: 'charmap' codec can't encode character u'\xa9' in position 0: character maps to <undefined>
    >>>

Пробуем сложить сроки и записать в файл:

    >>> f = open('test.txt', 'w')
    >>> f.write((a + b).encode('utf-8'))
    >>> f.close()

Работает!

Выводы

Даже не знаю. Похоже, что этот явление проявляется только в консоли, при печати. В общем, это что-то неведомое, чего стоит опасаться, на всякий случай.

Вот здесь предлагается “вычищать” эти символы из текста: http://code.activestate.com/recipes/546517-accent2htmlcodepy-convert-accents-and-special-char

Но, похоже, что вычищать не совсем правильно, так как они проходят через encode без ошибок.

Почитать для знания

http://www.joelonsoftware.com/articles/Unicode.html http://www.stereoplex.com/2009/nov/8/python-unicode-and-unicodedecodeerror/