Python3 CGI 中文問題 UnicodeEncodeError


首先不是python2,是python3
其次python3中沒unicode()這個東東!

在CGI時的錯誤提示:
Traceback (most recent call last): File "/usr/lib/cgi-bin/aa.py", line 29, in print(aaa) UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) 

操作系統:Ubuntu 9.10 Desktop
Apache: 使用apt-get install apache2進行的安裝
Python: 源代碼編譯安裝的python3.2

源代碼:aa.py

#!/usr/bin/python3
# coding:utf-8

print("Content-type: text/html\r\n\r\n")
print("<font size=+1>Environment</font>")

import sys

sys.stderr = sys.stdout

import os

os.environ["LANG"] = "en_US.UTF-8"


print(os.environ)

print("<br/>")
print("<br/>")
print(sys.getdefaultencoding())
print("<br/>")
print("<br/>")

aaa = "中文"

print(aaa.encode('utf-8'))
print("<br/>")
print("<br/>")
print(aaa)


在SHELL中執行的結果(使用print(aaa)能夠正確的打印“中文”)

aksai@aksai-laptop:/usr/lib/cgi-bin$ ./aa.py 
Content-type: text/html


<font size=+1>Environment</font>
environ({'GDM_KEYBOARD_LAYOUT': 'us', 'GNOME_DESKTOP_SESSION_ID': 'this-is-deprecated', 'LESSOPEN': '| /usr/bin/lesspipe %s', 'QT_IM_MODULE': 'xim', 'LOGNAME': 'aksai', 'USER': 'aksai', 'HOME': '/home/aksai', 'PATH': '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games', 'DISPLAY': ':0.0', 'SSH_AGENT_PID': '2162', 'LANG': 'en_US.UTF-8', 'TERM': 'xterm', 'SHELL': '/bin/bash', 'XDG_SESSION_COOKIE': 'd0e2ff0a2bea80f62af6e9d44cb416fd-1314800273.494167-419471248', 'SESSION_MANAGER': 'local/aksai-laptop:@/tmp/.ICE-unix/2118,unix/aksai-laptop:/tmp/.ICE-unix/2118', 'SHLVL': '1', 'WINDOWID': '65011716', '_': './aa.py', 'XMODIFIERS': '@im=SCIM', 'USERNAME': 'aksai', 'COLORTERM': 'gnome-terminal', 'SSH_AUTH_SOCK': '/tmp/keyring-gXkTYH/socket.ssh', 'GNOME_KEYRING_SOCKET': '/tmp/keyring-gXkTYH/socket', 'GDMSESSION': 'gnome', 'DBUS_SESSION_BUS_ADDRESS': 'unix:abstract=/tmp/dbus-uwisuseGp7,guid=665f17044637987ab53184d34e5e4292', 'ORBIT_SOCKETDIR': '/tmp/orbit-aksai', 'GNOME_KEYRING_PID': '2103', 'GTK_IM_MODULE': 'scim-bridge', 'DESKTOP_SESSION': 'gnome', 'LESSCLOSE': '/usr/bin/lesspipe %s %s', 'GTK_MODULES': 'canberra-gtk-module', 'OLDPWD': '/usr/lib/cgi-bin/Trash', 'GDM_LANG': 'en_US.UTF-8', 'XAUTHORITY': '/var/run/gdm/auth-for-aksai-Fy9q8t/database', 'SPEECHD_PORT': '7560', 'XDG_DATA_DIRS': '/usr/share/gnome:/usr/local/share/:/usr/share/', 'PWD': '/usr/lib/cgi-bin', 'GTK_RC_FILES': '/etc/gtk/gtkrc:/home/aksai/.gtkrc-1.2-gnome2', 'LS_COLORS': 'rs=0:di=01;34:ln=01;36:hl=44;37:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:'})
<br/>
<br/>
utf-8
<br/>
<br/>
b'\xe4\xb8\xad\xe6\x96\x87'
<br/>
<br/>
中文


在作CGI訪問時的錯誤(訪問地址:http://127.0.0.1/cgi-bin/aa.py)

Environment environ({'SERVER_SOFTWARE': 'Apache/2.2.12 (Ubuntu)', 'SCRIPT_NAME': '/cgi-bin/aa.py', 'SERVER_SIGNATURE': '
Apache/2.2.12 (Ubuntu) Server at 127.0.0.1 Port 80
\n', 'REQUEST_METHOD': 'GET', 'HTTP_KEEP_ALIVE': '115', 'SERVER_PROTOCOL': 'HTTP/1.1', 'QUERY_STRING': '', 'PATH': '/usr/local/bin:/usr/bin:/bin', 'LANG': 'en_US.UTF-8', 'HTTP_ACCEPT_CHARSET': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', 'HTTP_USER_AGENT': 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.10) Gecko/20100915 Ubuntu/9.10 (karmic) Firefox/3.6.10', 'HTTP_CONNECTION': 'keep-alive', 'SERVER_NAME': '127.0.0.1', 'REMOTE_ADDR': '127.0.0.1', 'SERVER_PORT': '80', 'SERVER_ADDR': '127.0.0.1', 'DOCUMENT_ROOT': '/var/www', 'SCRIPT_FILENAME': '/usr/lib/cgi-bin/aa.py', 'SERVER_ADMIN': 'webmaster@localhost', 'HTTP_HOST': '127.0.0.1', 'REQUEST_URI': '/cgi-bin/aa.py', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'GATEWAY_INTERFACE': 'CGI/1.1', 'REMOTE_PORT': '45753', 'HTTP_ACCEPT_LANGUAGE': 'en-us,en;q=0.5', 'HTTP_ACCEPT_ENCODING': 'gzip,deflate'})

utf-8

b'\xe4\xb8\xad\xe6\x96\x87' 

Traceback (most recent call last): File "/usr/lib/cgi-bin/aa.py", line 29, in print(aaa) UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) 


Apache環境配置(/etc/apache2/envvars):

# envvars - default environment variables for apache2ctl

# Since there is no sane way to get the parsed apache2 config in scripts, some
# settings are defined via environment variables and then used in apache2ctl,
# /etc/init.d/apache2, /etc/logrotate.d/apache2, etc.
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
export APACHE_PID_FILE=/var/run/apache2.pid

## The locale used by some modules like mod_dav
#export LANG=C
export LANG="en_US.UTF-8"
## Uncomment the following line to use the system default locale instead:
#. /etc/default/locale

export LANG


Apache的Deamon控制腳本(/etc/init.d/apache2)修改ENV變量如下:

#ENV="env -i LANG=C PATH=/usr/local/bin:/usr/bin:/bin"
ENV="env -i LANG=en_US.UTF-8 PATH=/usr/local/bin:/usr/bin:/bin"


傳說中錯誤的原因是沒有指定LANG,但不知道我修改Apache的配置是否正確。感謝各位賜教!

2 个解决方案

#1


sys.stdout.buffer.write(b"Content-type: text/html;encoding=UTF-8\n\n") # Not 100% sure about the spelling.
sys.stdout.buffer.write(aaa.encode('UTF8'))

#2


你前面的print(aaa.encode('utf-8'))就挺好。

盡量避免直接打印unicode。就算你搞好了,過兩天升級了下系統或者發給別人興許又掛了。別把時間浪費在這些能避免的事情上。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com