Найти - Пользователи
Полная версия: print в windows русского текста
Начало » Python для новичков » print в windows русского текста
1
gkraser
windows xp sp3, python 2.7.1

Имеем файл file1.py:
# -*- coding: utf-8 -*-
print 'hello'
print 'привет'
При выполнении на консоль выводит hello+крякозябры

Имеем файл file2.py:
# -*- coding: utf-8 -*-
print u'hello'
print u'привет'
При выполнении на консоль выводит hello+привет (типа как ожидается)

Замечательно, однако при:
python file1.py > out1
получаем out1 в кодировке utf-8 с правильным hello+привет.

А при:
python file2.py > out2
получаем (внезапно):
Traceback (most recent call last):                                                                                                                              
File "print_rus2.py", line 3, in <module>
print u'&#9576;&#9488;&#9572;А&#9576;&#9557;&#9576;&#9619;&#9576;&#9569;&#9572;В'
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128)
Это как то выходит за рамки ожидаемого…

Собственно вопрос - имеется некоторая куча утилит, которая выводит текст на консоль на русском языке. Все утилиты оформлены в кодировке utf-8 и все что попадает в print - unicode. Понадобилось вывод их перенаправлять в файлы. Вылезла ошибка….

Как от нее избавится?
ta
> file1.py
файл в кодировке utf-8 (строка тоже), в консоле винды кодировка другая (cp866 или как там её?).

> file2.py
здесь переменные - юникодные строки.
(питон автоматически определил кодировку в консоли винды и вывел текст в нужной кодеровке).

в файле1 строка в кодировке утф-8, в файле2 юникодная строка (это не кодировка).
перед записью в файл надо явно преобразовывать (юникодную) строку в нужную кодировку.
print u“это юникодная строка”.encode(“нужная_кодировка”)
Ferroman
Таким вопросам место в соседнем разделе.
Андрей Светлов
сделано
gkraser
Ferroman
Таким вопросам место в соседнем разделе.
Ну да, самое место таким вопросам в разделе для новичков…

вопрос был:

gkraser
Собственно вопрос - имеется некоторая куча утилит, которая выводит текст на консоль на русском языке. Все утилиты оформлены в кодировке utf-8 и все что попадает в print - unicode. Понадобилось вывод их перенаправлять в файлы. Вылезла ошибка….

Как от нее избавится?
Вот и ответ:

Нужно переопределить sys.stdout так, как вам понравится, и преобразовывать текст так, как нравится, например так:

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 еще сделайте.
gkraser
Андрей Светлов
Только .flush еще сделайте.
Спасибо, запамятовал что то…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB