OSX 10.6、apache2、python 2.6
好的,基本上,我有一个 UTF-8 文件,没有 BOM,包含一个网页 foo.html。如果它保存为 ascii,没有扩展的 Unicode 字符,我可以打开它,发送标题,打印文件,当我点击我的 URL showpag.py 时,它会很好地显示在 Web 浏览器中:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import codecs
fh = codecs.open('foo.html',encoding='utf-8')
pag = fh.read()
fh.close()
print u'Content-type: text/html; charset=utf-8'
print u''
print pag
但是,如果我在 foo.html 中嵌入了实际的 unicode(比如一个中文字符串),那么 safari(以及 chrome、omniweb 等,基本上我认为使用 webkit 的任何东西)都会显示一个没有内容的空白页面。当我说空白时,我的意思是白色,那里什么都没有,“显示源”也什么都不返回。看来apache根本拒绝发送数据。
foo.html 非常基础:
<!DOCTYPE HTML>
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE>Test Page</TITLE>
</HEAD>
<BODY>
English and UNICODE-CHINESE-CHARACTERS
</BODY>
</HTML>
我试过了:
- 在 apache conf 中关闭 gzip 输出
- 将 DefaultType 更改为 none
- 使用 sys.stdout.write(pag)
- 带有和不带有内容类型的 META 标记
- 有无内容长度标头
...这些都不会改变结果。
每次更改 apache 的 conf 时,我都会小心地重新启动 Web 服务。
删除 foo.html 中的 unicode 字符,它可以工作。把它们放进去,apache 发送一个空白页。
如果我不读取文件,也会发生同样的事情,而是直接从 python 生成输出:
x = u'CHINESE-UNICODE-CHARS'
print x
...这是一个空白页,而这个:
x = u'ENGLISH-UNICODE-CHARS' # ascii, but in unicode string
print x
...工作得很好(使用所有相同的标题等)
在两种情况下,从 shell 运行 python 脚本都会返回网页,正如预期的那样:shell 在正确的位置显示 unicode 字符,依此类推。同样,如果我让 apache 直接为页面提供服务,则 unicode 可以正常工作。
只有当输出从 python 到 Apache 时,我才会得到这个空白的、无内容的页面。我怀疑从 python 到 apache 的流在使用 16 位字符时会受到影响,但我不知道如何继续。