【问题标题】:MBCS to UTF-8: How to encode in PythonMBCS 到 UTF-8:如何在 Python 中编码
【发布时间】:2017-05-16 07:28:18
【问题描述】:

我正在尝试为 Windows 创建重复文件查找器。我的程序在 Linux 中运行良好。但它会将 NUL 字符写入 Windows 中的日志文件。这是由于 Windows 的 MBCS 默认文件系统编码,而 Linux 中的文件系统编码是 UTF-8。如何将 MBCS 转换为 UTF-8 以避免此错误?

【问题讨论】:

  • Windows 文件 API 本身是 UTF-16(实际上是 UCS-2),因此您应该使用 Unicode,例如os.listdir(u'.')。然后要写入日志文件,请使用io.openencoding='utf-8'。像这样,任何文本都不应该被'mbcs' (ANSI) 编码。
  • 实际上 os.scandir() 在 python3.5 中(不可用到 3.4)返回 MBCS 等效的 DirEntry.name,我需要是 UTF-8
  • 不,如果您将路径作为 Unicode 字符串传递,os.scandir 将返回 Unicode。 bytes Windows 3.5 甚至不允许使用路径。如果您升级到 3.6,您可以重新使用字节路径,因为我们已经彻底检查了 os 模块的内容,以使用 UTF-8 作为 Windows 上字节路径的文件系统编码。 3.6 在内部为bytes 消费者处理 UTF-16(即 Windows Unicode API)和 UTF-8 之间的转码。
  • 其实 os.scandir() 返回一个 DirEntry,调用它的 name 变量,因为 i.name 返回 MBCS 字符串,当用于写入 UTF-8 类型编码的文件时,产生 NULL 字符为印刷
  • 不,这是我最后一次告诉你你错了。 DirEntry namepath 属性是 str Unicode 字符串。它正在调用 Unicode(宽字符)文件 API(例如 FindFirstFileW)。不调用任何 ANSI API。在 Windows Python 3.5 中,os.scandir 严格禁止使用 bytes 路径。

标签: windows python-3.x python-3.5 mbcs


【解决方案1】:

告诉 Python 在日志文件上使用 UTF-8。在 Python 3 中,您可以通过以下方式执行此操作:

open(..., encoding='utf-8')

如果您想将 MBCS 字符串转换为 UTF-8,您可以切换字符串编码:

filename.encode('mbcs').decode('utf-8')

使用filename.encode(sys.getdefaultencoding())... 使代码也可以在 Linux 上运行。

【讨论】:

  • 我正在使用 utf-8,正如你所说,当我使用 os.scandir() 时,它会导致 MBCS 等效于 DirEntry 名称,我需要是 UTF-8
  • sys.getdefaultencoding() 说什么?
  • 它在 Windows 中返回 MBCS,而在 LINUX 上返回 UTF-8
【解决方案2】:

只需将编码更改为 'latin-1' (encoding='latin-1')

使用纯 Python: open(..., encoding = 'latin-1')

使用熊猫: pd.read_csv(..., encoding='latin-1')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 2015-08-15
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多