0

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 位字符时会受到影响,但我不知道如何继续。

4

1 回答 1

0

答案是:

print pag.encode('utf-8')

... Python 和 Apache 之间的流默认为 ASCII,所以我什么也没得到。

于 2013-08-18T21:31:29.147 回答