Уведомления

Jabber-конференция сообщества: pythonua@conference.jabber.ru

#1 Апрель 12, 2007 10:15:00

Все ники заняты
От:
Зарегистрирован: 2007-02-18
Сообщения: 156
Репутация: +  1  -
Профиль   Отправить e-mail  

Кодировки в print и raw_input

ActivePython 2.5, WinXP SP2.

# -*- coding: cp1251 -*-
print unicode('Привет','cp1251')
raw_input(unicode('Привет','cp1251'))
Почему первая строка работает, а вторая - нет?
Traceback (most recent call last):
File “C:\Temp\ttt.py”, line 3, in <module>
raw_input(unicode('¦ЁштхЄ','cp1251'))
UnicodeEncodeError: ‘ascii’ codec can't encode characters in position 0-5: ordinal not in range(128)
Можно ли raw_input использовать с русским языком?



Отредактировано (Апрель 12, 2007 10:18:28)

Офлайн

#2 Апрель 12, 2007 12:30:11

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Кодировки в print и raw_input

raw_input ждет обычную строку(объект класса str), а не unicode.

raw_input(unicode('Привет','cp1251').encode('cp1251'))



Офлайн

#3 Апрель 12, 2007 14:02:30

Все ники заняты
От:
Зарегистрирован: 2007-02-18
Сообщения: 156
Репутация: +  1  -
Профиль   Отправить e-mail  

Кодировки в print и raw_input

Спасибо, сработало так:

# -*- coding: cp1251 -*-
raw_input(unicode('Привет','cp1251').encode('cp866'))



Офлайн

#4 Апрель 12, 2007 14:07:34

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Кодировки в print и raw_input

Все правильно. В винде 2 кодировки. В гуи - cp1251, а в консоле cp866.



Офлайн

#5 Ноя. 22, 2008 17:49:02

Deutschmann
От:
Зарегистрирован: 2008-11-22
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Кодировки в print и raw_input

Никак не могу разобраться с выводом русского текста при исапользовании raw_input. Следующая программа работает в консоли:

# -*- coding: cp1251 -*-

from __future__ import division
from random import *
import re

def main():
while 1:
x = []
if raw_input(u"Ввести данные? (иначе будут использованы тестовые данные) - [y/n]:".encode("cp866")) == "y":
[<< кусок кода >>]
print u"Гипотеза о нормальном законе распределения выполняется? - ",endcond
if (raw_input(u"Продолжить работу с программой? - [y/n]:".encode("cp866")) == "n"): break

main()
В print Unicode выводится как надо, но в raw_input ни в какую - поэтому приходиться использовать функцию encode(“cp866”). А очень хотелось бы получить более простое и универсальное решение, что-то вроде одной строчки в начале файла ) .



Отредактировано (Ноя. 22, 2008 17:51:11)

Офлайн

#6 Ноя. 22, 2008 17:53:28

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Кодировки в print и raw_input

# -*- coding: cp866 -*- ???
или сохранять в utf-8 и указать sys.setdefaultencoding('cp866')



Отредактировано (Ноя. 22, 2008 17:56:42)

Офлайн

#7 Ноя. 22, 2008 17:55:44

The gray Cardinal
От:
Зарегистрирован: 2007-03-07
Сообщения: 422
Репутация: +  0  -
Профиль   Отправить e-mail  

Кодировки в print и raw_input

Deutschmann
1. Удобнее всегда писать исходник в utf-8.
2. ActivePython: решение проблем с кодировками.



Офлайн

#8 Ноя. 22, 2008 17:56:06

Deutschmann
От:
Зарегистрирован: 2008-11-22
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Кодировки в print и raw_input

igor.kaist
Иероглифы получаются, пока спасает только encode.



Офлайн

#9 Ноя. 22, 2008 17:58:52

The gray Cardinal
От:
Зарегистрирован: 2007-03-07
Сообщения: 422
Репутация: +  0  -
Профиль   Отправить e-mail  

Кодировки в print и raw_input

Deutschmann

import codecs, sys
outf = codecs.getwriter('cp866')(sys.stdout, errors='replace')
sys.stdout = outf

raw_input(u'Привет')



Офлайн

#10 Ноя. 22, 2008 18:13:55

Deutschmann
От:
Зарегистрирован: 2008-11-22
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Кодировки в print и raw_input

The gray Cardinal
Deutschmann
import codecs, sys
outf = codecs.getwriter('cp866')(sys.stdout, errors='replace')
sys.stdout = outf

raw_input(u'Привет')
Работает на сто процентов:

# -*- coding: cp1251 -*-

from __future__ import division
from random import *
import re
import codecs, sys
outf = codecs.getwriter('cp866')(sys.stdout, errors='replace')
sys.stdout = outf


def main():
while 1:
x = []
if raw_input(u"Ввести данные? (иначе будут использованы тестовые данные) - [y/n]:") == "y":
[<<кусок кода>>]

main()
Спасибо за решение, но хочется более простого в одну строчку. Кстати, исходник сохраненный в UTF-8 в блокноте например, в ActiveState Python PythonWin редакторе открывается иероглифами, а в IDLE тем не менее все нормально, так же как и в самом блокноте. (PS Если бы не это то проблемы бы для меня и не было, а так обидно)

Причем в примере выше строка в raw_input обязательно должна быть Unicode (u“”), иначе UnicideDecodeError исключение, что тоже немного плоховато.



Отредактировано (Ноя. 22, 2008 18:24:47)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version