我有一个Windows-1252编码的输入文件,其中包含'®'字符。我需要将此字符写入UTF-8文件。还假设我必须使用Python 2.7。看起来很简单,但我不断收到UnicodeDecodeErrors。
我最初刚刚使用带有UTF-8编码的codecs.open()
打开原始文件,这对所有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文件?上面的方法过去一直对我有用,直到遇到®字符。
答案 0 :(得分:1)
如果0xC2应代表®
字符,则您的文件不在Windows-1252中;在Windows-1252中,0xC2为Â
。
但是,您应该使用
of.write(line)
因为正确编码是您首先使用codecs
的全部原因。