我问(在评论中)“”“向我们展示 print repr(weird_special_characters) 的输出。当你在 vim 中打开文件时,什么是正确的?请比“格式化奇怪”更精确。”“”但什么都没有:- (
你在看什么文件od
?file.gz
?? 如果您可以在其中看到任何可识别的内容,则它不是 gzip 文件!您没有看到换行符,您看到的是包含 0x0A 的二进制字节。
如果原始文件是 utf-8 编码的,那么用其他编解码器尝试它的意义何在?
“使用 zcat 可以正常工作”是否意味着您在没有 utf8 解码步骤的情况下获得了可识别的数据?
我建议您简化代码,并一次执行一步……例如,请参阅此问题的接受答案。再试一次,请显示您运行的确切代码,并在描述结果时使用 repr()。
更新看起来 DS 已经猜到了您试图解释的有关 \x1c 和 \x1d 的内容。
以下是关于为什么会发生这种情况的一些说明:
在 ASCII 中,换行时只考虑 \r 和 \n:
>>> import pprint
>>> text = ''.join('A' + chr(i) for i in range(32)) + 'BBB'
>>> print repr(text)
'A\x00A\x01A\x02A\x03A\x04A\x05A\x06A\x07A\x08A\tA\nA\x0bA\x0cA\rA\x0eA\x0fA\x10
A\x11A\x12A\x13A\x14A\x15A\x16A\x17A\x18A\x19A\x1aA\x1bA\x1cA\x1dA\x1eA\x1fBBB'
>>> pprint.pprint(text.splitlines(True))
['A\x00A\x01A\x02A\x03A\x04A\x05A\x06A\x07A\x08A\tA\n', # line break
'A\x0bA\x0cA\r', # line break
'A\x0eA\x0fA\x10A\x11A\x12A\x13A\x14A\x15A\x16A\x17A\x18A\x19A\x1aA\x1bA\x1cA\x
1dA\x1eA\x1fBBB']
>>>
但是在 Unicode 中,字符 \x1D(文件分隔符)、\x1E(组分隔符)和 \x1E(记录分隔符)也可以作为行尾:
>>> text = u''.join('A' + unichr(i) for i in range(32)) + u'BBB'
>>> print repr(text)
u'A\x00A\x01A\x02A\x03A\x04A\x05A\x06A\x07A\x08A\tA\nA\x0bA\x0cA\rA\x0eA\x0fA\x10A\x11A\x12A\x13A\x14A\x15A\x16A\x17A\x18A\x19A\x1aA\x1bA\x1cA\x1dA\x1eA\x1fBBB'
>>> pprint.pprint(text.splitlines(True))
[u'A\x00A\x01A\x02A\x03A\x04A\x05A\x06A\x07A\x08A\tA\n', # line break
u'A\x0bA\x0cA\r', # line break
u'A\x0eA\x0fA\x10A\x11A\x12A\x13A\x14A\x15A\x16A\x17A\x18A\x19A\x1aA\x1bA\x1c', # line break
u'A\x1d', # line break
u'A\x1e', # line break
u'A\x1fBBB']
>>>
无论您使用什么编解码器,这都会发生。您仍然需要确定需要使用什么(如果有)编解码器。您还需要确定原始文件是否真的是文本文件而不是二进制文件。如果是文本文件,需要考虑文件中\x1c和\x1d的含义。