Здравствуйте, enji, Вы писали:
E>Здравствуйте, HiSH, Вы писали:
HSH>>В каком месте-то падает, и с каким traceback'ом? Сдается мне, что не на моменте unicode(text), а на моменте sys.stdout.write(unicoded_text). Потому что в sys.stdout нужно байты писать, а не символы — и оно пытается привести unicode'ный string к обычному string'у. И наверняка умолчальной кодировкой ANSI. HSH>>В общем, нужен traceback.
E>
E>u = unicode(text)
E>sys.stdout.write(u)
E>Traceback (most recent call last):
E> File "z:\__tools\python26\scons-2.1.0\SCons\Util.py", line 157, in __call__
E> u = unicode(text)
E>UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 8: ordinal not in range(128)
E>
E>До write не доходит
Ок, теперь, если кодировка text'а — точно cp1251, и мы напишем u = unicode(text, 'cp1251'), оно должно упасть на следующей строчке, потому что попытаеся сериализовать unicode в string дефолтным конвертором ASCII, и у него это не получится.
Значит, нужно сделать преобразование за него: sys.stdout.write(u.encode("cp1251")). Тогда вопрос — зачем было к юникоду текст приводить? Или локаль консоли — не cp1251? Тогда нужно просто ее правильно выставить во второй строке.
Так работает из консоли винды (непонятно почему кстати, чем print отличается от sys.stdout.write? ), однако если вызывать из консоли eclipse, выдает ERROR: cant display some text...
.......
В каком месте-то падает, и с каким traceback'ом? Сдается мне, что не на моменте unicode(text), а на моменте sys.stdout.write(unicoded_text). Потому что в sys.stdout нужно байты писать, а не символы — и оно пытается привести unicode'ный string к обычному string'у. И наверняка умолчальной кодировкой ANSI.
В общем, нужен traceback.
Здравствуйте, HiSH, Вы писали:
HSH>В каком месте-то падает, и с каким traceback'ом? Сдается мне, что не на моменте unicode(text), а на моменте sys.stdout.write(unicoded_text). Потому что в sys.stdout нужно байты писать, а не символы — и оно пытается привести unicode'ный string к обычному string'у. И наверняка умолчальной кодировкой ANSI. HSH>В общем, нужен traceback.
u = unicode(text)
sys.stdout.write(u)
Traceback (most recent call last):
File "z:\__tools\python26\scons-2.1.0\SCons\Util.py", line 157, in __call__
u = unicode(text)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 8: ordinal not in range(128)
Здравствуйте, HiSH, Вы писали:
HSH>Ок, теперь, если кодировка text'а — точно cp1251, и мы напишем u = unicode(text, 'cp1251'), оно должно упасть на следующей строчке, потому что попытаеся сериализовать unicode в string дефолтным конвертором ASCII, и у него это не получится. HSH>Значит, нужно сделать преобразование за него: sys.stdout.write(u.encode("cp1251")). Тогда вопрос — зачем было к юникоду текст приводить? Или локаль консоли — не cp1251? Тогда нужно просто ее правильно выставить во второй строке.
Вот так заработало: sys.stdout.write(text), без преобразования в unicode. По ходу тестили это дело под никсам, а там юникодная консоль...