考虑我需要从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
的读数。检测到编码。
答案 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
。