Форум сайта python.su
Уже обсуждалось тут http://python.su/forum/viewtopic.php?pid=59229 , но решения я там не увидел. Вот такой код:
#!C:/Python32/python.exe
# -*- coding: utf-8 -*-
import cgitb
cgitb.enable()
print("Content-Type: text/html; charset=utf-8")
print()
s = 'русскИе буквы'
z = s.encode('utf-8').decode('windows-1251')
print(s)
print(z)
C:\Program Files\Apache Software Foundation\Apache2.2\cgi-bin\test.py in ()
10
11 s = '������� �����'
=> 12 z = s.encode().decode('windows-1251')
13 print(s)
14 print(z)
z undefined, s = '������� �����', s.encode = <built-in method encode of str object>, ).decode undefined
C:\Python32\lib\encodings\cp1251.py in decode(self=<encodings.cp1251.Codec object>, input=<memory>, errors='strict')
13
14 def decode(self,input,errors='strict'):
=> 15 return codecs.charmap_decode(input,errors,decoding_table)
16
17 class IncrementalEncoder(codecs.IncrementalEncoder):
global codecs = <module 'codecs' from 'C:\Python32\lib\codecs.py'>, codecs.charmap_decode = <built-in function charmap_decode>, input = <memory>, errors = 'strict', global decoding_table = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./...�������������������������������������������������'
UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 11: character maps to <undefined>
args = ('charmap', b'\xd1\x80\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\x98\xd0\xb5 \xd0\xb1\xd1\x83\xd0\xba\xd0\xb2\xd1\x8b', 11, 12, 'character maps to <undefined>')
encoding = 'charmap'
end = 12
object = b'\xd1\x80\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\x98\xd0\xb5 \xd0\xb1\xd1\x83\xd0\xba\xd0\xb2\xd1\x8b'
reason = 'character maps to <undefined>'
start = 11
with_traceback = <built-in method with_traceback of UnicodeDecodeError object>
Офлайн
А может наоборот:
z = s.decode('utf-8').encode('windows-1251')
Офлайн
zloymihвот разъяснительная статья, но она по питону 2.
Вообще запутался в этих кодировках. :( прошу помощи. Windows. Python3.2.
Офлайн
Bujhm666тогда ошибка:
А может наоборот:
Код:
z = s.decode('utf-8').encode('windows-1251')
C:\Program Files\Apache Software Foundation\Apache2.2\cgi-bin\test.py in ()
11 s = '������� �����'
12 #z = s.encode().decode('windows-1251')
=> 13 z = s.decode('windows-1251').encode()
14 print(s)
15 print(z)
z undefined, s = '������� �����', s.decode undefined
AttributeError: 'str' object has no attribute 'decode'
args = ("'str' object has no attribute 'decode'",)
with_traceback = <built-in method with_traceback of AttributeError object>
o7412369815963А команда print() выводит текст в кодировке windows-1251. А нужно чтобы текст выводился в браузер в utf-8. Я проверяю так: скрипт выводит в браузер “s” и “z” - если у браузера установлена кодировка windows-1251 могу прочитать строку s, а где z - там каракули. Выставляю в браузере кодировку utf-8 -там где s - знаки вопроса, а где z - читаемый текст. Но как только встречается большая буква И - ошибка.
у вас исходный код предположительно в utf8
Отредактировано (Март 18, 2011 08:40:32)
Офлайн
вот эта конструкция не правильная: z = s.encode('utf-8').decode('windows-1251')
она случайно прокатывает с маленькими буквами.
думаю виндовая консоль не способна понять utf8, поэтому делается такой выкрутас и через консоль летит cp1251 который по байтам совпадает с utf8, если не совпадает, то вываливается ошибка.
вообщем: либо выводите все в cp1251,
либо переходите в linux там нормально передается любая кодировка
либо используйте нормальные веб-коннеторы (wsgi и т.п.)
Офлайн