【问题标题】:Python required utf-16 encoding on simple filePython 要求对简单文件进行 utf-16 编码
【发布时间】:2021-11-06 08:20:53
【问题描述】:

我解决了这个问题,但我想了解原因。

我在运行 Python 3.9.6 的 Windows 10 电脑上。我有一个简单的文本文件,里面只有一行,就是:

50_50

一段时间以来,我一直在运行一个小的 python 实用程序文件,打开这样的文件并解析内容没有任何问题,但我一直在使用 Python 3.7。我的代码很简单:

with open(companyfile) as companies:
    for company in companies:
    ...

当我昨天运行这个时,我开始从这个简单的单行文件中得到垃圾而不是文本。我认为这很可能是因为我没有提供编码并将代码更改为:

with open(companyfile, 'r', encoding='utf-8') as companies:

这给了我这个错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

最后试了utf-16,文件打开处理正常。

所以我的问题是,既然我使用的是 Python 3.9,我是否必须始终指定 utf-16?我试图打开的简单文件中没有特殊字符;所以我不明白为什么它有问题。

任何见解都将不胜感激。

谢谢--

阿尔

【问题讨论】:

  • 尝试使用 open(companyfile, 'rb') 打开文件并查看文件内容。这将阻止字节解码,因此您可以查看文件的内容并检查无关字符。
  • 我确实试过了,虽然 vim 在文件中没有看到任何奇怪的东西,但用 'rb' 打开它确实发现了无关字符。由于我自己用 vim 手动创建了文件,我不确定这些无关字符是从哪里来的……不过这是我的第一个线索。
  • 您是否能够使用新文件重新创建此问题?
  • 您必须以保存它的编码打开文件。无论出于何种原因,该文件都以 UTF-16 编码保存。 open() 的默认值是 locale.getpreferredencoding(False),对于美国 Windows 通常是 cp1252

标签: python python-3.x utf


【解决方案1】:

utf-16 中的每个字符都是 16 位或 2 个字节长,如名称所示。尝试将其作为utf-8 编码文件打开是行不通的,因为这两种编码在基本层面上不兼容。我认为我使用的大多数文件都是utf-8,但很多微软程序(如Powershell和Excel)默认会在utf-16中生成文本文档。

在“猜测”编码方面,there isn't really a "right" way to do it. 在任何文件中都没有通用的字节序列来指定所使用的编码,因为编码是相当随意的,并且可以随时设计新的。

【讨论】:

  • 这并不完全正确。或者至少有细微差别。 byte order mark 在 UTF-16 和 UTF-32 中是必需的,在 UTF-8 中是可选的(标准规定它是允许的,尽管许多 *nix 系统不能正确处理 UTF-8 BOM)。但是,如果您知道文件是使用 a UTF 编码编码的,则可以确定哪种类型和哪种字节序。如果初始字节序列与已知的 UTF BOM 匹配,则猜测该编码并非没有道理。
  • 所以我应该总是打开文件'rb',检查 BOM,然后用正确的 utf 编码打开吗?如果是这样,gak...是否有某种方法(手动创建文件时)来确保它们是 utf-8?
  • @AlG 大多数(如果不是全部)文本编辑器都允许您选择编码。如果在 Python 上创建,请在打开文件时指定编码,例如open(file,'w',encoding='utf8')。在 Windows 上,utf-8-sig 可能更可取,因为它会在文件开头写入一个以 UTF-8 编码的 BOM 字符作为签名,并且 Excel 等 Windows 应用程序将识别这一点并假定 UTF-8 而不是 ANSI 默认编码(通常为cp1252,但因本地化而异)。
猜你喜欢
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 2015-07-09
  • 2020-08-02
  • 2014-04-22
  • 1970-01-01
相关资源
最近更新 更多