彼得·派珀用管道传输了一个Python程序,丢失了他所有的unicode字符

2024-04-24 16:18:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python脚本,它使用urllib2.urlopen加载网页,执行一些不同的魔术,并使用print输出结果。然后在Windows上运行程序,如下所示:

python program.py > output.htm

问题是:

urlopen从输出UTF8的iisweb服务器读取数据。它将同样的数据输出到输出,但是某些字符(例如Word总是违背您的意愿为您插入长连字符,因为它比您聪明)会被弄乱,最后变成–。在

在进一步的调查中,我注意到即使web服务器输出UTF8数据,output.htm文件是用ISO-8859-1字符集编码的。在

我的问题:

  1. 当你在Windows上将Python程序重定向到输出文件时,它总是使用这个字符集吗?在
  2. 如果是这样,有没有办法改变这种行为?在
  3. 如果没有,是否有解决办法?我想我可以将output.htm作为命令行参数传入,然后写入该文件而不是屏幕,但我必须在程序中重做一大堆逻辑。在

谢谢你的帮助!在

更新:

output.htm的顶部,我添加了:

^{pr2}$

然而,这没有什么区别。字符仍然是乱码。如果我在Firefox中手动切换到UTF-8,文件会正确显示。IE和FF都认为这个文件是西方的ISO,尽管它显然不是。在


Tags: 文件数据程序服务器脚本网页outputwindows
3条回答

从您的评论和问题更新来看,数据似乎正确编码为UTF-8。这意味着您只需要告诉您的浏览器它是UTF-8,或者使用BOM,或者通过向HTML文档中添加编码信息来更好:

<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>

如果文档不是有效的XML,就不应该使用XML声明。在

最好和最可靠的方法是通过HTTP为文件提供服务,并适当地设置Content-Type:头。在

大多数Windows下的程序都会假定您使用的是默认的Windows编码,对于英语安装,它将是ISO-8859-1。这也适用于命令窗口输出。不幸的是,没有办法将默认编码设置为UTF-8—有一个为它定义的代码页,但是它没有得到很好的支持。在

有些编辑器会在文件的开头识别任何BOM字符并切换到UTF-8,但这不能保证。在

如果您要生成HTML,您应该包含正确的charset标记;然后浏览器将正确解释它。在

When you pipe a Python program to an output file on Windows, does it always use this character set?

用于输出到管道的默认编码。在我的机器上:

In [5]: sys.getdefaultencoding()
Out[5]: 'ascii'

If not, is there a workaround?

^{pr2}$

现在所有输出都被编码为“utf-8”。在

我认为处理这种情况的正确方法

redo a whole bunch of logic

将来自internet源的所有数据从服务器或页面编码解码为unicode,然后使用上面显示的解决方法将默认编码设置为utf-8。在

相关问题 更多 >