Python CGI не работает, если в коде есть русские буквы

Модератор: Модераторы разделов

Ответить
awua
Сообщения: 594

Python CGI не работает, если в коде есть русские буквы

Сообщение awua »

Когда генерится страница только с английскими буквами - всё нормально. Но если вставить хоть одну русскую - ничего не генерится. И ошибки никакой нет. Просто бланковая страница. Тут человек уже задавал подобный вопрос, но ответа, по-видимому, не получил. Кто-нибудь знает причину?
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Python CGI не работает, если в коде есть русские буквы

Сообщение watashiwa_daredeska »

Так страница с русскими буквами или код? Или русскоязычные константы прямо в код забиты? И неплохо бы посмотреть на код скрипта.
Спасибо сказали:
awua
Сообщения: 594

Re: Python CGI не работает, если в коде есть русские буквы

Сообщение awua »

Код: Выделить всё

#!/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.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Python CGI не работает, если в коде есть русские буквы

Сообщение watashiwa_daredeska »

Второй строкой добавить: # -*- coding: utf-8 -*-, ну или какая там у Вас кодировка.
Спасибо сказали:
awua
Сообщения: 594

Re: Python CGI не работает, если в коде есть русские буквы

Сообщение awua »

Код: Выделить всё

#!/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>""")

Всё равно не работает.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Python CGI не работает, если в коде есть русские буквы

Сообщение Bizdelnick »

У Вас там точно UTF-8?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
awua
Сообщения: 594

Re: Python CGI не работает, если в коде есть русские буквы

Сообщение awua »

Код: Выделить всё

$ 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, где присустсвует только английский алфавит? Хотя, кодировку в коде указал.
И чем только кодеку последняя строка не угодила?...
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Python CGI не работает, если в коде есть русские буквы

Сообщение watashiwa_daredeska »

print — слишком умная штука. Используйте sys.stdout.write
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable
Контактная информация:

Re: Python CGI не работает, если в коде есть русские буквы

Сообщение Portnov »

Другой вариант: явно указать, что строка юникодная: u"""<html>...
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Python CGI не работает, если в коде есть русские буквы

Сообщение watashiwa_daredeska »

Portnov писал(а):
05.06.2012 14:49
Другой вариант: явно указать, что строка юникодная: u"""<html>...
Не поможет. Ошибка с ascii codec возникает от того, что при запуске CGI локаль "C", т.е. не-ascii из юникода тоже не сконвертятся. Меня, правда, удивляет, что print пытается что-то там перекодировать для неюникодных строк, а не просто выводит as is.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Python CGI не работает, если в коде есть русские буквы

Сообщение watashiwa_daredeska »

Ага, кажется я начинаю понимать. Python 3?
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Python CGI не работает, если в коде есть русские буквы

Сообщение watashiwa_daredeska »

Для 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())
Спасибо сказали:
awua
Сообщения: 594

Re: Python CGI не работает, если в коде есть русские буквы

Сообщение awua »

watashiwa_daredeska писал(а):
05.06.2012 15:19
Ага, кажется я начинаю понимать. Python 3?

Да.

Ваш код генерит страницу с выводом:

Код: Выделить всё

а б&#131;б&#129;б&#129;аКаИаЙ б&#130;аЕаКб&#129;б&#130;.
Content-type: text/html
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Python CGI не работает, если в коде есть русские буквы

Сообщение watashiwa_daredeska »

Ok, порешаю за Вас проблемы. Хоть сам посмотрю на грабли Python 3. :)

Код: Выделить всё

#!/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())
Так у меня работает. И в консоли, и как CGI.
Спасибо сказали:
awua
Сообщения: 594

Re: Python CGI не работает, если в коде есть русские буквы

Сообщение awua »

Так всё работает.
Чем больше читаю такие куски кода, тем больше думаю, что для полноценного программирования нужно знать 100500 библиотек к твоему языку...
Спасибо сказали:
awua
Сообщения: 594

Re: Python CGI не работает, если в коде есть русские буквы

Сообщение awua »

watashiwa_daredeska, как вы нашли эту проблему? Это написано в спецификациях CGI? Или вы просто много пишете для CGI на Python и знаете подводные камни?
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Python CGI не работает, если в коде есть русские буквы

Сообщение watashiwa_daredeska »

awua писал(а):
05.06.2012 21:14
Это написано в спецификациях CGI? Или вы просто много пишете для CGI на Python и знаете подводные камни?
В данном конкретном случае проблема вообще не связана с CGI. Попробуйте позапускать все скрипты из топика просто в командной строке, потом в виде LC_ALL=C ./page.cgi | cat и найдите 10 отличий :)
Спасибо сказали:
Ответить