Python 3.4在Apache2服务器(Mac)上导致UnicodeEncodeError,但在命令行中工作正常

时间:2014-06-07 08:34:06

标签: python apache python-2.7 python-3.x unicode

我正在尝试使用Python 3.4 cgi脚本和Apache在浏览器中输出“ü”字符(对于任何其他Unicode字符也会出现同样的问题)。 python 3.4 cgi脚本在Apache中导致UnicodeEncodeError,而类似的python 2.7代码在同一服务器上工作正常。脚本3.4和2.7都可以在命令行中正常工作。

这是我在运行python 3.4脚本时遇到的错误:

UnicodeEncodeError:'ascii'编解码器无法对位置23中的字符'\ xfc'进行编码:序数不在范围内(128)

以下是导致该错误的代码:

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

print ("Content-Type: text/html; charset=utf-8\n\n")
print ("""\
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
""")

print ("U umlaut (Python 3.4): ü<br>")

print ("""\
</body>
</html>
""")

同一服务器上面的Python 2.7脚本正确显示ü和任何其他Unicode字符: (所以这不是Apache的问题吗?)

#!/usr/bin/python
# -*- coding: utf-8 -*-

print "Content-Type: text/html; charset=utf-8\n\n"
print """\
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
"""

print "U umlaut (Python 2.7): ü<br>"

print """\
</body>
</html>
"""

两个脚本都可以从命令行正常运行。我已经

AddDefaultCharset UTF-8

在我的httpd.conf中。

另外,我的语言环境变量设置如下:

LANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL="en_US.UTF-8"

已经包含了我能想到的UTF-8设置(有时过度)。有谁知道我还能做些什么让python 3.4脚本在浏览器中正确显示Unicode字符?感谢。

1 个答案:

答案 0 :(得分:1)

我知道这是你的问题后的几个月,但我偶然发现它面临同样的问题。我找到了解决方案。也许它对你和其他寻求者没有帮助。

Jack O'Connor's solution fixed the problem for me试试这个:

import sys
sys.stdout = open(sys.stdout.fileno(), mode='w', encoding='utf8', buffering=1)
print("日本語")
# Also works with other methods of writing to stdout:
sys.stdout.write("日本語\n")
sys.stdout.buffer.write("日本語\n".encode())`