我尝试使用以下脚本将位于Web服务器中的文本文件传输到客户端(文本文件为UTF-16)。
import cgi
print "Content-Type: text/plain"
print "Content-Disposition: attachment; filename=TEST.txt"
print
filename = "C:\\TEST.TXT"
f = open(filename, 'r')
for line in f:
print line
但是,当我打开下载的文件时,该文件都有奇怪的字符。我尝试使用rb
标志,但它也没有。
我有什么遗漏的吗?我希望的是,客户端通过查询上述脚本而下载的文件(TEST.TXT)将与服务器中的文件完全相同。
我还尝试明确地具体编码。
import cgi
print "Content-Type: text/plain; charset=UTF-16"
print "Content-Disposition: attachment; filename=TEST.txt"
print
filename = "C:\\TEST.TXT"
f = open(filename, 'r')
for line in f:
print line.encode('utf-16')
这也不起作用。
服务器上的原始文件
已下载的文件
如果您有兴趣尝试一下,我会在此发布original text file。
答案 0 :(得分:2)
首先,您应在Content-Type
标题中指定文件encoding:
print "Content-Type: text/plain; charset=UTF-16"
print "Content-Disposition: attachment; filename=TEST.txt"
print
然后,在将它们发送到客户端时,您必须对UTF-16中的行进行实际编码:
print "\xff\xfe", # send UTF-16 big-endian BOM
for line in f:
print line.encode("utf-16be")
答案 1 :(得分:1)
只需忽略文本编码,并通过0修改将字节到字节传输到客户端。
#!c:/Python27/python.exe -u
import sys
print "Content-Type: text/plain;"
print "Content-Disposition: attachment; filename=TEST.txt"
print
filename = "C:\\TEST.TXT"
f = open(filename, 'rb')
while True:
data = f.read(4096)
sys.stdout.write(data)
if not data:
break