Python 在XML文件中存储VT100转义码
我正在编写一个Python程序,它记录终端交互,类似于脚本程序,我希望以XML格式存储日志 问题在于终端交互包括VT100转义码。如果我以UTF-8编码方式将数据写入文件,Python不会抱怨,例如:Python 在XML文件中存储VT100转义码,python,xml,unicode,tty,vt100,Python,Xml,Unicode,Tty,Vt100,我正在编写一个Python程序,它记录终端交互,类似于脚本程序,我希望以XML格式存储日志 问题在于终端交互包括VT100转义码。如果我以UTF-8编码方式将数据写入文件,Python不会抱怨,例如: ... pid, fd = pty.fork() if pid==0: os.execvp("bash",("bash","-l")) else: # Lots of TTY-related stuff here # see http://groups.google.com
...
pid, fd = pty.fork()
if pid==0:
os.execvp("bash",("bash","-l"))
else:
# Lots of TTY-related stuff here
# see http://groups.google.com/group/comp.lang.python/msg/de40b36c6f0c53cc
fout = codecs.open("session.xml", encoding="utf-8", mode="w")
fout.write('<?xml version="1.0" encoding="UTF-8"?>\n')
fout.write("<session>\n")
...
r, w, e = select.select([0, fd], [], [], 1)
for f in r:
if f==fd:
fout.write("<entry><![CDATA[")
buf = os.read(fd, 1024)
fout.write(buf)
fout.write("]]></entry>\n")
else:
....
fout.write("</session>")
fout.close()
该脚本的工作原理是将文件写入磁盘,但生成的文件不是正确的utf-8,这会导致像etree这样的XML解析器在转义码上呕吐
解决这一问题的一种方法是首先。但是,如果可以这样做,即维护转义码,并使用etree之类的XML工具解析生成的文件,那又有什么可能呢 您是否尝试将数据放入CDATA区域?这将防止解析器尝试读取标记的内容
您的问题不是控制代码不是正确的UTF-8,而是ASCII ESC和friends不是正确的XML字符,即使在CDATA区域内也是如此
XML 1.0中值小于U+0020的唯一有效XML字符是U+0009制表符、U+000A换行符和U+000D回车符。如果您想记录涉及其他代码(如escape U+001B)的内容,则必须以某种方式将其转义。没有其他选择。正如Charles所说,大多数控制代码可能根本不包含在XML 1.0文件中 但是,如果您能够接受XML 1.1的要求,您可以在那里使用它们。它们不能作为原始字符包含,但可以作为字符引用。例如:

因为您不能在CDATA节中写入字符引用,它们只会被解释为符号和散列-…,所以您必须丢失包装器并手动将&字符转义到它们的实体引用等价物中
请注意,您无论如何都应该这样做:CDATA部分并不免除您对文本转义的责任,因为如果序列中包含文本,它们将失败]]>。由于您总是需要进行一些转义,这使得CDATA部分在大多数情况下都毫无用处
XML 1.1在控制代码方面更为宽松,但并不是所有东西都支持它,而且仍然不能包含NUL字符&0;。一般来说,在XML中包含控制字符不是一个好主意。您可以使用一个特殊的编码方案来适应二进制文件;base-64很流行,但不是很容易让人阅读。如果只有您自己的应用程序才会处理这些文件,或者将它们编码为元素,例如。是的,我确实尝试将数据放在CDATA区域中,但这不起作用。我将编辑上面的示例代码以反映这一点。错误答案:解析器确实读取CDATA部分的内容,并检查它是否只包含不包含ESC字符的合法XML字符。