DJM*_*y12 7 python encoding utf-16
最近,我在 Python 中打开特定的 UTF-16 编码文件时遇到问题。我已经尝试过以下方法:
import codecs
f = codecs.open('filename.data', 'r', 'utf-16-be')
contents = f.read()
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
UnicodeDecodeError: 'utf16' codec can't decode bytes in position 18-19: illegal UTF-16 surrogate
Run Code Online (Sandbox Code Playgroud)
尝试读取文件的内容后。我也尝试过强制使用小尾数,但这不好。文件头如下:
0x FE FF EE FF
Run Code Online (Sandbox Code Playgroud)
我读过的表示 UTF-16 Big Endian。我已经能够使用以下命令将文件的内容读入原始字符串:
f = open('filename.data', 'rb')
raw = f.read()
hex = binascii.hexlify(raw)
Run Code Online (Sandbox Code Playgroud)
这可以让我获得原始十六进制,但问题是 - 有时这些文件是小端,有时它们是大端,所以我本质上只是想在开始解析之前规范化数据,我希望编解码器会这样做能够帮助我,但没有运气..
有人知道这里发生了什么事吗?我会提供文件作为参考,但有一些敏感数据,所以不幸的是我不能。该文件由 Windows 操作系统使用。
正如我上面提到的,我的最终目标是能够打开/读取这些文件并规范化它们,以便我可以对所有这些文件使用相同的解析器,而不是必须编写一些带有一堆错误处理的解析器如果编码很古怪。
编辑:根据要求,文件的前 32 个字节:
FE FF EE FF 11 22 00 00 03 00 00 00 01 00 00 00
92 EC DA 48 1B 00 00 00 63 00 3A 00 5C 00 77 00
Run Code Online (Sandbox Code Playgroud)
看起来在 utf16 编码字符串开始之前有一个 24 个二进制字节的标头。因此,您可以将文件读取为二进制文件,然后进行解码:
with open(filename, "rb") as data:
header = data.read(24)
text = data.read().decode('utf-16-le')
Run Code Online (Sandbox Code Playgroud)
但可能还有其他二进制部分。在不知道确切的文件格式的情况下,无法提供更多帮助。
| 归档时间: |
|
| 查看次数: |
20088 次 |
| 最近记录: |