我正在尝试使用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字符?感谢。
答案 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())`