Python CGI не работает, если в коде есть русские буквы
Модератор: Модераторы разделов
-
- Сообщения: 594
Python CGI не работает, если в коде есть русские буквы
Когда генерится страница только с английскими буквами - всё нормально. Но если вставить хоть одну русскую - ничего не генерится. И ошибки никакой нет. Просто бланковая страница. Тут человек уже задавал подобный вопрос, но ответа, по-видимому, не получил. Кто-нибудь знает причину?
-
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: Python CGI не работает, если в коде есть русские буквы
Так страница с русскими буквами или код? Или русскоязычные константы прямо в код забиты? И неплохо бы посмотреть на код скрипта.
Мои розовые очки
-
- Сообщения: 594
Re: Python CGI не работает, если в коде есть русские буквы
Код: Выделить всё
#!/usr/bin/python
import os, cgi
print("Content-type: text/html\n")
print("""<!DOCTYPE html>
<html>
<head>
<title>CGI</title>
</head>
<body>
<p>Параграф русского текста. В коде русских букв, естественно, нет.</p>
</body>
</html>""")
Даже подсветка синтаксиса в Pluma не кажет Python.
-
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: Python CGI не работает, если в коде есть русские буквы
Второй строкой добавить: # -*- coding: utf-8 -*-, ну или какая там у Вас кодировка.
Мои розовые очки
-
- Сообщения: 594
Re: Python CGI не работает, если в коде есть русские буквы
Код: Выделить всё
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os, cgi
print("Content-type: text/html\n")
print("""<!DOCTYPE html>
<html>
<head>
<title>CGI</title>
</head>
<body>
<p>Русский текст.</p>
</body>
</html>""")
Всё равно не работает.
-
- Модератор
- Сообщения: 21030
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Python CGI не работает, если в коде есть русские буквы
У Вас там точно UTF-8?
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 594
Re: Python CGI не работает, если в коде есть русские буквы
Код: Выделить всё
$ locale
LANG=ru_RU.utf8
LC_CTYPE="ru_RU.utf8"
LC_NUMERIC="ru_RU.utf8"
LC_TIME="ru_RU.utf8"
LC_COLLATE="ru_RU.utf8"
LC_MONETARY="ru_RU.utf8"
LC_MESSAGES="ru_RU.utf8"
LC_PAPER="ru_RU.utf8"
LC_NAME="ru_RU.utf8"
LC_ADDRESS="ru_RU.utf8"
LC_TELEPHONE="ru_RU.utf8"
LC_MEASUREMENT="ru_RU.utf8"
LC_IDENTIFICATION="ru_RU.utf8"
LC_ALL=
Вот финальный вариант:
Код: Выделить всё
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os, cgi, cgitb
cgitb.enable()
print("Content-type: text/html\n")
print("""<!DOCTYPE html>
<html>
<head>
<title>CGI</title>
</head>
<body>
<p>Русский текст.</p>
</body>
</html>""")
Ошибка такая:
Код: Выделить всё
Traceback (most recent call last):
File "/srv/http/000/page.cgi", line 20, in <module>
</html>""")
UnicodeEncodeError: 'ascii' codec can't encode characters in position 71-77: ordinal not in range(128)
Я так понимаю, используется 7-битная кодировка ASCII, где присустсвует только английский алфавит? Хотя, кодировку в коде указал.
И чем только кодеку последняя строка не угодила?...
-
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: Python CGI не работает, если в коде есть русские буквы
print — слишком умная штука. Используйте sys.stdout.write
Мои розовые очки
-
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
Re: Python CGI не работает, если в коде есть русские буквы
Другой вариант: явно указать, что строка юникодная: u"""<html>...
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
-
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: Python CGI не работает, если в коде есть русские буквы
Не поможет. Ошибка с ascii codec возникает от того, что при запуске CGI локаль "C", т.е. не-ascii из юникода тоже не сконвертятся. Меня, правда, удивляет, что print пытается что-то там перекодировать для неюникодных строк, а не просто выводит as is.
Мои розовые очки
-
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: Python CGI не работает, если в коде есть русские буквы
Ага, кажется я начинаю понимать. Python 3?
Мои розовые очки
-
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: Python CGI не работает, если в коде есть русские буквы
Для Python 3 как-то так:
Код: Выделить всё
#!/usr/bin/python3
import io, cgi, cgitb, sys
cgitb.enable()
if hasattr(sys.stdout, "buffer"):
bwrite = sys.stdout.buffer.write
write = sys.stdout.write
else:
bwrite = sys.stdout.write
write = io.TextIOWrapper(sys.stdout).write
write("Content-type: text/html\n\n")
bwrite("""<!DOCTYPE html>
<html>
<head>
<title>CGI</title>
</head>
<body>
<p>Русский текст.</p>
</body>
</html>""".encode())
Мои розовые очки
-
- Сообщения: 594
Re: Python CGI не работает, если в коде есть русские буквы
Да.
Ваш код генерит страницу с выводом:
Код: Выделить всё
а бƒббаКаИаЙ б‚аЕаКбб‚.
Content-type: text/html
-
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: Python CGI не работает, если в коде есть русские буквы
Ok, порешаю за Вас проблемы. Хоть сам посмотрю на грабли Python 3. :)
Так у меня работает. И в консоли, и как CGI.
Код: Выделить всё
#!/usr/bin/python3
import io, cgi, cgitb, sys
cgitb.enable()
if hasattr(sys.stdout, "buffer"):
def bwrite(s):
sys.stdout.flush()
sys.stdout.buffer.write(s)
write = sys.stdout.write
else:
wrapper = io.TextIOWrapper(sys.stdout)
def bwrite(s):
wrapper.flush()
sys.stdout.write(s)
write = wrapper.write
write("Content-type: text/html;charset=utf-8\r\n\r\n")
bwrite("""<!DOCTYPE html>
<html>
<head>
<title>CGI</title>
</head>
<body>
<p>Русский текст.</p>
</body>
</html>""".encode())
Мои розовые очки
-
- Сообщения: 594
Re: Python CGI не работает, если в коде есть русские буквы
Так всё работает.
Чем больше читаю такие куски кода, тем больше думаю, что для полноценного программирования нужно знать 100500 библиотек к твоему языку...
Чем больше читаю такие куски кода, тем больше думаю, что для полноценного программирования нужно знать 100500 библиотек к твоему языку...
-
- Сообщения: 594
Re: Python CGI не работает, если в коде есть русские буквы
watashiwa_daredeska, как вы нашли эту проблему? Это написано в спецификациях CGI? Или вы просто много пишете для CGI на Python и знаете подводные камни?
-
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: Python CGI не работает, если в коде есть русские буквы
В данном конкретном случае проблема вообще не связана с CGI. Попробуйте позапускать все скрипты из топика просто в командной строке, потом в виде LC_ALL=C ./page.cgi | cat и найдите 10 отличий :)
Мои розовые очки