彼得派珀吹嘘一个Python程序 - 并失去了他所有的unicode角色

Mik*_*sen 16 python utf-8 iso-8859-1 character-encoding piping

我有一个Python脚本,它使用加载网页urllib2.urlopen,做一些不同的魔法,然后使用它来吐出结果print.然后,我们在Windows上运行该程序,如下所示:

python program.py > output.htm
Run Code Online (Sandbox Code Playgroud)

这是问题所在:

urlopen从其输出UTF8 IIS Web服务器读取数据.它会将相同的数据吐出到输出中,但是某些字符(例如Word总是会根据您的意愿为您插入的长连字符,因为它比您更聪明)会出现乱码并最终变形–.

经过进一步调查,我注意到即使Web服务器吐出UTF8数据,该output.htm文件也使用ISO-8859-1字符集进行编码.

我的问题:

  1. 当您将Python程序重定向到Windows上的输出文件时,它是否始终使用此字符集?
  2. 如果是这样,有没有办法改变这种行为?
  3. 如果没有,是否有解决方法?我想我可以直接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">
Run Code Online (Sandbox Code Playgroud)

但是,它没有任何区别.角色仍然是乱码.如果我在Firefox中手动切换到UTF-8,则文件会正确显示.IE和FF都认为这个文件是Western ISO,尽管它显然不是.

Nik*_* B. 8

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

<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
Run Code Online (Sandbox Code Playgroud)

如果文档不是有效的XML,那么你真的不应该使用XML声明.

最好和最可靠的方法是通过HTTP提供文件并Content-Type:适当设置标头.


rec*_*dev 5

当您将Python程序传输到Windows上的输出文件时,它是否始终使用此字符集?

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

In [5]: sys.getdefaultencoding()
Out[5]: 'ascii'
Run Code Online (Sandbox Code Playgroud)

如果没有,是否有解决方法?

import sys
try:
    sys.setappdefaultencoding('utf-8')
except:
    sys = reload(sys)
    sys.setdefaultencoding('utf-8')
Run Code Online (Sandbox Code Playgroud)

现在所有输出都被编码为'utf-8'.

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

重做一大堆逻辑

是将您的互联网源中的所有数据从服务器或页面编码解码为unicode,然后使用上面显示的解决方法将默认编码设置为utf-8.