Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 8, 2010 21:24:28

gkraser
От:
Зарегистрирован: 2007-08-25
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

print в windows русского текста

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. Понадобилось вывод их перенаправлять в файлы. Вылезла ошибка….

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



Офлайн

#2 Дек. 8, 2010 22:38:43

ta
Зарегистрирован: 2009-12-15
Сообщения: 90
Репутация: +  0  -
Профиль   Отправить e-mail  

print в windows русского текста

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

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

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

Отредактировано (Дек. 8, 2010 22:49:24)

Офлайн

#3 Дек. 9, 2010 00:04:59

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

print в windows русского текста

Таким вопросам место в соседнем разделе.

Офлайн

#4 Дек. 9, 2010 00:35:40

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

print в windows русского текста

сделано



Офлайн

#5 Дек. 9, 2010 18:50:13

gkraser
От:
Зарегистрирован: 2007-08-25
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

print в windows русского текста

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__)



Офлайн

#6 Дек. 9, 2010 19:29:21

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

print в windows русского текста

Хорошее решение. Только .flush еще сделайте.



Офлайн

#7 Дек. 9, 2010 20:16:28

gkraser
От:
Зарегистрирован: 2007-08-25
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

print в windows русского текста

Андрей Светлов
Только .flush еще сделайте.
Спасибо, запамятовал что то…



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version