Как стать автором
Обновить

Комментарии 4

А почему вы использовали 2.7, а не какой-нибудь свежий 3.7, в которых все строки юникодные по умолчанию?

Стоило так сделать, да. Просто начал проект на 2.7, а переделывать было уже лень.

Если лень передлывать руками есть утилита 2to3 которая решает 90% проблем перехода со второй версии на третью

Да что там переделывать-то?
Однако даже в 2 питоне есть простое правило: на входе декодируем, на выходе кодируем, внутри только юникод.
Проблема с символами, кстати, в данном случае на уровне Windows. Там до сих пор встречаются ситуации, когда командная строка и входные параметры интерпретируется как win866 (запрещенная в разумном мире однобайтовая кодировка), а терминал, куда пишет stdout, в win1251 (запрещенная в разумном мире однобайтовая кодировка).
Можно задекорировать stdout в перекодирующий поток. Там, в общем-то, так и задумано из коробки, но для винды имеет смысл это сдедалть явно, поскольку не всегда можно получить от stdout его кодировку через атрибут. Ошибка возникает в двух случаях: 1) когда кодировка не определена и принимается как ascii, соответственно любые не ascii символы будут конвертироваться с ошибкой; 2) когда в строке попадаются символы, которым нет аналогов в однобайтной кодировке (длинные тире, мягкие переносы и всякое такое). Первый пункт у вас решен, второй вы решаете заменой некоторых символов. Я бы настроил дополнительно конвертацию с игнором или автозаменой непредставимых символов. И я бы всё же не работал внутри программы с кодированными (не юникодными) строками. Это плохая примета=)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации