Найти - Пользователи
Полная версия: Кодировки в print и raw_input
Начало » Python для экспертов » Кодировки в print и raw_input
1 2
Все ники заняты
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 использовать с русским языком?
slivlen
raw_input ждет обычную строку(объект класса str), а не unicode.
raw_input(unicode('Привет','cp1251').encode('cp1251'))
Все ники заняты
Спасибо, сработало так:
# -*- coding: cp1251 -*-
raw_input(unicode('Привет','cp1251').encode('cp866'))
slivlen
Все правильно. В винде 2 кодировки. В гуи - cp1251, а в консоле cp866.
Deutschmann
Никак не могу разобраться с выводом русского текста при исапользовании 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”). А очень хотелось бы получить более простое и универсальное решение, что-то вроде одной строчки в начале файла ) .
igor.kaist
# -*- coding: cp866 -*- ???
или сохранять в utf-8 и указать sys.setdefaultencoding('cp866')
The gray Cardinal
Deutschmann
1. Удобнее всегда писать исходник в utf-8.
2. ActivePython: решение проблем с кодировками.
Deutschmann
igor.kaist
Иероглифы получаются, пока спасает только encode.
The gray Cardinal
Deutschmann
import codecs, sys
outf = codecs.getwriter('cp866')(sys.stdout, errors='replace')
sys.stdout = outf

raw_input(u'Привет')
Deutschmann
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 исключение, что тоже немного плоховато.
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