【问题标题】:Opening and reading UTF-16 files in Python在 Python 中打开和读取 UTF-16 文件
【发布时间】:2015-07-06 17:15:20
【问题描述】:

最近我在 Python 中打开特定的 UTF-16 编码文件时遇到了问题。我尝试了以下方法:

import codecs
f = codecs.open('filename.data', 'r', 'utf-16-be')
contents = f.read()

但我收到以下错误:

UnicodeDecodeError: 'utf16' codec can't decode bytes in position 18-19: illegal UTF-16 surrogate

在尝试读取文件内容后。我也尝试过强制使用 little-endian,但这并不好。文件头如下:

0x FE FF EE FF

我读过的表示 UTF-16 Big Endian。我已经能够使用以下命令将文件的内容读入原始字符串:

f = open('filename.data', 'rb')
raw = f.read()
hex = binascii.hexlify(raw)

这可以让我得到原始十六进制,但问题是 - 有时这些文件会是小端,有时它们会是大端,所以我基本上只是想在开始解析之前对数据进行规范化,我是希望编解码器能够帮助我,但没有运气..

有人知道这里发生了什么吗?我会提供文件作为参考,但有一些敏感数据,所以很遗憾我不能。此文件由 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

【问题讨论】:

  • UnicodeDecodeError: illegal UTF-16 surrogate 告诉您,您正在阅读的内容不是合法的 UTF-16。你确定是这样写的吗?你能用十六进制发布文件的前 32 个字节吗?
  • 感谢您的快速回复,我将使用前 32 个字节进行编辑

标签: python encoding utf-16


【解决方案1】:

在您的 utf16 编码字符串开始之前,您似乎有一个 24 个二进制字节的标头。所以你可以将文件读取为二进制文件并在之后解码:

with open(filename, "rb") as data:
    header = data.read(24)
    text = data.read().decode('utf-16-le')

但可能还有其他二进制部分。在不知道确切的文件格式的情况下,无法提供更多帮助。

【讨论】:

  • 感谢您的回答,您怎么知道文件开头有二进制文件?
  • Welp,你只是一针见血。试过这个,它比我想象的更成功。我现在完全按照我的需要将文件解码为 ascii。你这个摇滚人。
猜你喜欢
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 2018-02-26
  • 1970-01-01
相关资源
最近更新 更多