如何从Windows-1252文件中读取®字符并写入UTF-8文件

时间:2015-10-14 15:24:24

标签: python python-2.7 utf-8

我有一个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文件?上面的方法过去一直对我有用,直到遇到®字符。

1 个答案:

答案 0 :(得分:1)

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

但是,您应该使用

of.write(line)

因为正确编码是您首先使用codecs的全部原因。