python Вывод кириллицы в консоль
От: enji  
Дата: 03.10.11 05:56
Оценка:
Есть программа (scons-2.1), которая падает на строке
sys.stdout.write(unicode(text))

если text содержит кириллицу (UnicodeError). Win7, python26

Я попытался поправить:
try:
    utext = unicode(text)
except UnicodeError:              
    utext = unicode(text, 'cp1251', 'replace')            
sys.stdout.write(utext)


Все равно падает. Попробовал вот так:
try:
    utext = unicode(text)
except UnicodeError:              
    utext = unicode(text, 'cp1251', 'replace')            
try:
    sys.stdout.write(utext)
except UnicodeError:  
    try:
        if utext[-1] == '\n':
          utext = utext[:-1]
        print utext
    except UnicodeError:
        sys.stdout.write('ERROR: cant display some text...')

Так работает из консоли винды (непонятно почему кстати, чем print отличается от sys.stdout.write? ), однако если вызывать из консоли eclipse, выдает ERROR: cant display some text...

Как правильно исправить эту строчку?
Re: python Вывод кириллицы в консоль
От: HiSH Россия http://m0riarty.ya.ru
Дата: 04.10.11 21:07
Оценка:
Здравствуйте, enji, Вы писали:

E>Есть программа (scons-2.1), которая падает на строке

E>
E>sys.stdout.write(unicode(text))
E>

E>если text содержит кириллицу (UnicodeError). Win7, python26

E>Я попытался поправить:

E>
E>try:
E>    utext = unicode(text)
E>except UnicodeError:              
E>    utext = unicode(text, 'cp1251', 'replace')            
E>sys.stdout.write(utext)
E>

.......
В каком месте-то падает, и с каким traceback'ом? Сдается мне, что не на моменте unicode(text), а на моменте sys.stdout.write(unicoded_text). Потому что в sys.stdout нужно байты писать, а не символы — и оно пытается привести unicode'ный string к обычному string'у. И наверняка умолчальной кодировкой ANSI.
В общем, нужен traceback.
Re[2]: python Вывод кириллицы в консоль
От: enji  
Дата: 06.10.11 11:35
Оценка:
Здравствуйте, 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)


До write не доходит
Re[3]: python Вывод кириллицы в консоль
От: alex_public  
Дата: 06.10.11 16:33
Оценка:
Здравствуйте, enji

# -*- coding: cp1251 -*-
print u'Привет мир!'


В python 2.6 всё работает. )
Re[3]: python Вывод кириллицы в консоль
От: HiSH Россия http://m0riarty.ya.ru
Дата: 06.10.11 18:49
Оценка: 4 (1)
Здравствуйте, 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? Тогда нужно просто ее правильно выставить во второй строке.
Re[4]: python Вывод кириллицы в консоль
От: enji  
Дата: 14.10.11 13:03
Оценка:
Здравствуйте, HiSH, Вы писали:

HSH>Ок, теперь, если кодировка text'а — точно cp1251, и мы напишем u = unicode(text, 'cp1251'), оно должно упасть на следующей строчке, потому что попытаеся сериализовать unicode в string дефолтным конвертором ASCII, и у него это не получится.

HSH>Значит, нужно сделать преобразование за него: sys.stdout.write(u.encode("cp1251")). Тогда вопрос — зачем было к юникоду текст приводить? Или локаль консоли — не cp1251? Тогда нужно просто ее правильно выставить во второй строке.

Вот так заработало: sys.stdout.write(text), без преобразования в unicode. По ходу тестили это дело под никсам, а там юникодная консоль...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.