我问(在评论中)“”“向我们展示 print repr(weird_special_characters) 的输出。当你在 vim 中打开文件时,什么是正确的?请比“格式化奇怪”更精确。“”“但是什么都没有:-(
您在查看od 的哪个文件? file.gz??如果您可以在其中看到任何可识别的内容,则它不是 gzip 文件!您没有看到换行符,您看到的是包含 0x0A 的二进制字节。
如果原始文件是 utf-8 编码的,那么尝试使用其他编解码器有什么意义?
“使用 zcat 可以正常工作”是否意味着您在没有 utf8 解码步骤的情况下获得了可识别的数据??
我建议您简化您的代码,并一次执行一步...例如,请参阅this question 的已接受答案。再试一次,请显示您运行的确切代码,并在描述结果时使用 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的含义。