Найти - Пользователи
Полная версия: print() не выводит кириллицу (apache cgi)
Начало » Python для новичков » print() не выводит кириллицу (apache cgi)
1
Игнат
подключил python3 как cgi к апач2.2
вывожу кириллицу через print()
получаю

File “/home/python3/www/engine/as_base.py”, line 57, in log
print(' %s' % (type, text))
UnicodeEncodeError: ‘ascii’ codec can't encode character ‘\u0432’ in position 3: ordinal not in range(128)

пробовал text.encode('utf-8', ‘ignore’)

получается на экране:

b'\xd0\xb2 res/proxy.txt 0 \xd0\xbf\xd1\x80\xd0\xbe\xd0\xba\xd1\x81\xd0\xb8'

все файлы в utf-8, текст прописан в них
при запуске шлется хидер что контент в utf-8

что тут не так?
o7412369815963
>b'\xd0\xb2 res/proxy.txt 0 \xd0\xbf\xd1\x80\xd0\xbe\xd0\xba\xd1\x81\xd0\xb8'
это нормальный utf8

что выдаст если в консоли запустить скрипт?
попробуйте скачать страничку, через wget например.
Игнат
$ cat index.html\?start.1

ну также, как и в сорцах страницы:

<pre>
<a href='?stop'>stop</a>
b'\xd0\xb2 res/proxy.txt 0 \xd0\xbf\xd1\x80\xd0\xbe\xd0\xba\xd1\x81\xd0\xb8'
b'\xd0\xb7\xd0\xb0\xd0\xb3\xd1\x80\xd1\x83\xd0\xb7\xd0\xb8\xd0\xbb\xd0\xb8 0 \xd0\xbf\xd1\x80\xd0\xbe\xd0\xba\xd1\x81\xd0\xb8'
<br />executed success!

браузер никогда не понимал подобную кодировку
o7412369815963
значить ошибка в исходнике, он выдает представление строки вместо самой строки. покажите скрипт.
Игнат
print('<title>русский текст</title>'.encode('utf-8'))
sys.exit(0)
выводит

b'<title>\xd1\x80\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 \xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82</title>'

а ещё один вариант:
output = lambda msg: (sys.stdout.buffer.write(b'Content-type: text/html;charset=utf-8\n\n'),
sys.stdout.buffer.write(msg))

output('тест'.encode('utf-8'))
выводит по-русски, но после него идет Content-type: text/html;charset=utf-8\n\n обычным текстом
Игнат
в общем, рабочий пример запуска python3 как CGI в апач 2.2 с кириллицей в браузере вот:
 #!/usr/local/bin/python3
import sys, os
os.dup2(1, 2) # copy stderr->stdout
sys.stdout.buffer.write(b'Content-type: text/html;charset=utf-8\n\n')

def out(msg):
sys.stdout.buffer.write(msg.encode('utf8'))
sys.stdout.flush()

# test
import time
for i in range(10):
out('кириллица<br />')
time.sleep(1)
файл сохраняем в utf-8
в браузере тоже должна быть выбрана эта кодировка
все ошибки копируются в stdout, т.е. в браузер


подключение в httpd.conf:
- создаем вирт. хост, добавляем хэндлер
- в директории со скриптами добавляем +ExecCGI
- ставим на скрипт права на выполнение: chmod +x script.py
 <VirtualHost localhost:80>
ServerAdmin admin@localhost2
DocumentRoot /home/python3/www
ServerName pyweb
ErrorLog logs/pyweb_errors
CustomLog logs/pyweb_custom common

AddHandler cgi-script .cgi .py .pyw # важно
</VirtualHost>

<Directory "/home/python3/www">
DirectoryIndex start.pyw
Options +ExecCGI # важно
</Directory>
вроде бы больше ничего не требуется
IIIypuk
Игнат, а через print никак нельзя вывести?
CapMen
IIIypuk
Игнат, а через print никак нельзя вывести?

В Windows:
 
#!c:/python33/python.exe
# -*- coding: cp1251 -*-
print("Content-type: text/html\n\n");

print('привет')

или

 
#!c:/python33/python.exe
# coding: cp1251
print("Content-type: text/html\n\n");

print('привет')



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