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