2015-10-14 164 views
0

我有一个包含'®'字符的Windows-1252编码输入文件。我需要将此字符写入UTF-8文件。还假设我必须使用Python 2.7。看起来很简单,但我不断收到UnicodeDecodeErrors。如何从Windows-1252文件中读取®字符并写入UTF-8文件

我原本只是打开使用codecs.open()使用UTF-8编码,它工作得很好了所有的ASCII字符,直到它遇到®符号,于是它用错误哽咽原始文件:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xae in position 2867043: 
invalid start byte 

我知道我必须正确解码它作为cp1252来解决这个问题,所以我打开它以适当的编码,然后在写入之前将数据编码为UTF-8。但是,这产生了新的错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 22: 
ordinal not in range(128) 

这里是一个最低工作例如:

with codecs.open('in.txt', mode='rb', encoding='cp1252') as inf: 
    with codecs.open('out.txt', mode='wb', encoding='utf-8') as of: 
     for line in inf: 
      of.write(line.encode('utf-8')) 

这里是in.txt内容:

Sample file 

Here is my sample file® yay. 

我想也许我可以打开它在'rb'模式中没有指定编码,并且具体处理每条线的解码和编码,如下所示:

of.write(line.decode('cp1252').encode('utf-8')) 

但这也不起作用,给出与我刚刚打开UTF-8时相同的错误。

如何从Windows-1252文件读取数据,正确解码并将其编码为UTF-8并将其写入UTF-8文件?上述方法在过去一直为我工作,直到我遇到了®角色。

回答

1

如果0xC2应代表®字符,则您的文件不在Windows-1252中;在Windows-1252中,0xC2是Â

然而,你应该只使用

of.write(line) 

,因为正确的编码是你首先使用codecs的全部理由。

+0

这解决了这个问题,但你能帮助我更好地理解一点。编解码器以某种方式处理我的编码?附:我会接受这一点,但它不会让我多几分钟。 –

+0

@BobDylan:是的,在飞行中进行en /解码是编解码器包的**作业**。阅读文档! –

+0

是的,我尝试了解更多,但文档似乎只记录所有的方法。关于它是如何工作的并没有真正的(低级别)描述。如果你有任何解释它的链接,而不仅仅是列出所有的方法,并简要描述他们做什么,但不知道它们是如何工作的,我想了解更多。没有biggie,如果没有,这是我接受的答案,我很欣赏你的时间。 –

相关问题