2010-05-10 74 views
2

我的目标是编写一个XML文件,其中的值以区域语言表示。我使用Python来做到这一点,并使用IDLE(Pythong GUI)进行编程。将数据写入xml文件时的UnicodeEncodeError

虽然我尽量把字写在一个个XML文件,它提供了以下错误:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)

现在,我没有使用任何XML作家库;相反,我打开一个文件“test.xml”并将数据写入它。该行遇到此错误: f.write(data) 如果我用print语句替换上面的write语句,那么它会在Python shell上正确地打印数据。

我从Excel文件中读取的数据不是UTF-8,16或32编码格式。它以其他格式。 cp1252正在正确读取数据。

任何帮助获取这个数据写入XML文件将不胜感激。

回答

6

你应该.decode传入cp1252获得Unicode字符串,并.encode他们utf-8(由XML迄今为止首选编码),在你写的时间,其中unicodedata.decode('cp1252')上获得的,即

f.write(unicodedata.encode('utf-8')) 

传入的字节串。

这可以通过使用codecs模块标准Python库代替普通open打开每个与他们正确编码的输入和输出文件把唇膏就可以了,但我展示的是底层的机制(和它的通常,虽然并非总是更直接,更直接地应用它,而不是间接地通过codecs--一个风格和品味的问题)。

什么确实无论是总的原则:翻译你的输入字符串只要你可以得到他们之后的Unicode,使用整个处理unicode的,他们回到转换为字节串在后期,你可以之前你输出它们。这给你最简单,最直接的生活! - )

+0

感谢您的这种快速回复。 :) 我实际上做了同样的操作,当我得到错误... 文件“C:\ test.py”,第64行,在主 uData = items.decode('cp1252') 文件“C :\ Python26 \ lib \ encodings \ cp1252.py“,第15行解码 返回codecs.charmap_decode(input,errors,decode_table) UnicodeEncodeError:'ascii'编解码器无法对0-4位置的字符进行编码:ordinal not在范围内(128) 我没有得到真正的理由为什么发生这种情况。可能'cp1252'可能不是将用于解码的实际格式。在这种情况下我能做些什么? :( – Bobby 2010-05-10 05:50:47

+0

我们可以关闭这个线程,我的问题解决了,其实我的数据已经是unicode数据了,它不应该被解码,但是,在XML文件中写入我使用了下面的代码来解决我的问题。import cgi dataToWrite = cgi.escape(data).encode(“ascii”,“xmlcharrefreplace”)谢谢你的帮助。 – Bobby 2010-05-10 06:04:30