Форум сайта python.su
windows xp sp3, python 2.7.1
Имеем файл file1.py:
# -*- coding: utf-8 -*-
print 'hello'
print 'привет'
# -*- coding: utf-8 -*-
print u'hello'
print u'привет'
python file1.py > out1
python file2.py > out2
Traceback (most recent call last):
File "print_rus2.py", line 3, in <module>
print u'╨┐╤А╨╕╨▓╨╡╤В'
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128)
Офлайн
> file1.py
файл в кодировке utf-8 (строка тоже), в консоле винды кодировка другая (cp866 или как там её?).
> file2.py
здесь переменные - юникодные строки.
(питон автоматически определил кодировку в консоли винды и вывел текст в нужной кодеровке).
в файле1 строка в кодировке утф-8, в файле2 юникодная строка (это не кодировка).
перед записью в файл надо явно преобразовывать (юникодную) строку в нужную кодировку.
print u“это юникодная строка”.encode(“нужная_кодировка”)
Отредактировано (Дек. 8, 2010 22:49:24)
Офлайн
Таким вопросам место в соседнем разделе.
Офлайн
сделано
Офлайн
FerromanНу да, самое место таким вопросам в разделе для новичков…
Таким вопросам место в соседнем разделе.
gkraserВот и ответ:
Собственно вопрос - имеется некоторая куча утилит, которая выводит текст на консоль на русском языке. Все утилиты оформлены в кодировке utf-8 и все что попадает в print - unicode. Понадобилось вывод их перенаправлять в файлы. Вылезла ошибка….
Как от нее избавится?
class _ConsoleWrapper(object):
__slots__= "fileno", "softspace",
def __init__(self, fileobject):
self.fileno= fileobject.fileno()
self.softspace = False
def write(self, text):
if isinstance(text, unicode):
os.write(self.fileno, text.encode(sys.stdin.encoding))
else:
os.write(self.fileno, text)
sys.stdout = _ConsoleWrapper(sys.__stdout__)
sys.stderr = _ConsoleWrapper(sys.__stderr__)
Офлайн
Хорошее решение. Только .flush еще сделайте.
Офлайн
Андрей СветловСпасибо, запамятовал что то…
Только .flush еще сделайте.
Офлайн