【发布时间】: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.open和encoding='utf-8'。像这样,任何文本都不应该被'mbcs'(ANSI) 编码。 -
实际上 os.scandir() 在 python3.5 中(不可用到 3.4)返回 MBCS 等效的 DirEntry.name,我需要是 UTF-8
-
不,如果您将路径作为 Unicode 字符串传递,
os.scandir将返回 Unicode。bytesWindows 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 字符为印刷
-
不,这是我最后一次告诉你你错了。
DirEntryname和path属性是strUnicode 字符串。它正在调用 Unicode(宽字符)文件 API(例如FindFirstFileW)。不调用任何 ANSI API。在 Windows Python 3.5 中,os.scandir严格禁止使用bytes路径。
标签: windows python-3.x python-3.5 mbcs