我有一个Python脚本,它使用urllib2.urlopen
加载网页,执行一些不同的魔术,然后使用print
输出结果。然后我们在Windows上运行该程序,如下所示:
python program.py > output.htm
问题来了:
urlopen
从输出UTF8的IIS服务器读取数据。它会在输出中显示相同的数据,但是某些字符(比如Word总是违背您的意愿为您插入长连字符,因为它比您聪明)会乱码,并以–
结尾。
在进一步的调查中,我注意到即使web服务器输出UTF8数据,output.htm
文件也是使用ISO8859-1字符集编码的。
我的问题:
output.htm
作为命令行参数传入,并写入该文件而不是屏幕,但我必须在程序中重做一大堆逻辑。谢谢你的帮助!
更新:
在output.htm
的顶部,我添加了:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
然而,这并没有什么区别。这些字符仍然是乱码。如果我在Firefox中手动切换到UTF-8,文件可以正确显示。IE和FF都认为这个文件是西方ISO,尽管它显然不是。
发布于 2012-01-07 01:15:32
从你的评论和问题更新来看,数据似乎是用UTF-8正确编码的。这意味着您只需要告诉浏览器它是UTF-8,或者通过使用BOM,或者更好的方式,通过向HTML文档添加编码信息:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
如果文档不是有效的XML,就不应该使用XML声明。
最好和最可靠的方法是通过超文本传输协议提供文件并适当地设置Content-Type:
头。
发布于 2012-01-07 01:01:34
当你通过管道把Python程序放到Windows的输出文件中时,它总是使用这个字符集吗?
用于输出到管道的默认编码。在我的机器上:
In [5]: sys.getdefaultencoding()
Out[5]: 'ascii'
如果没有,是否有解决方法?
import sys
try:
sys.setappdefaultencoding('utf-8')
except:
sys = reload(sys)
sys.setdefaultencoding('utf-8')
现在,所有输出都被编码为'utf-8‘。
我认为处理这种情况的正确方法是
重做了一大堆逻辑
就是将来自internet源的所有数据从服务器或页面编码解码为unicode
,然后使用上面所示的变通方法将默认编码设置为utf-8
。
发布于 2012-01-07 01:10:53
Windows下的大多数程序都假定您使用的是默认的Windows编码,对于英文安装,编码为ISO-8859-1。这也适用于命令窗口输出。遗憾的是,没有办法将默认编码设置为UTF-8 -有为其定义的代码页,但它没有得到很好的支持。
有些编辑器会识别文件开头的任何BOM字符,并切换到UTF-8,但这不能保证。
如果要生成超文本标记语言,则应该包含适当的charset
标记;这样浏览器就会正确地解释它。
https://stackoverflow.com/questions/8761310
复制相似问题