正确编码从stdin读取的XML文件

时间:2015-12-07 21:36:33

标签: python

考虑我需要从stdin读取XML文件。如何正确编码?

目前我只是做

xmlString = sys.stdin.read()
doc = xml.dom.minidom.parseString(xmlString)

显然xmlString并不总是正确解码,导致误解字符。

是否有可能解决这个问题,或者我必须接受stdin“得到的内容”吗?

修改 假设通过stdin提供的文件是具有适当XML声明的SVG文件,例如,考虑

<?xml version="1.0" encoding="UTF-8">
<svg xmlns="http://www.w3.org/2000/svg">
  <desc>ú</desc>
</svg>

这意味着encoding属性可用于检测编码(但显然我必须至少阅读第一行),之后我必须以某种方式调整stdin的读数。检测到编码。

2 个答案:

答案 0 :(得分:1)

在这种情况下,解决方案最容易。与

try:
    input = sys.stdin.buffer
except AttributeError:
    input = sys.stdin

xmlString = input.read()
doc = xml.dom.minidom.parseString(xmlString)

stdin作为二进制流打开(即未解码)。在我的特定情况下,XML解析器自己处理解码就好了,不需要我的任何努力。

请注意,默认情况下,Python 3在文本模式(解码)中打开stdin,但在许多情况下显然使用了错误的字符编码。因此,buffer属性是访问基础二进制流所必需的。 异常处理是必要的,因为这是早期版本的Python中的默认行为,并且buffer属性不可用。

答案 1 :(得分:0)

如果文件编码每次都不同,并且完全未知,您可以使用chardet library来猜测它的编码。请注意,它使用一些统计数据来找到最佳匹配,因此它并不完美。

如果您知道数据的编码,则有两种选择。 PYTHONIOENCODING variable,或使用str.decode