【发布时间】:2018-06-13 11:00:22
【问题描述】:
我的问题:
- 从美国 Windows 10 安装开始
- 在 Windows 资源管理器中创建日语文件名
- 打开 Python shell,然后
os.listdir('.')- 列出的文件名全是问号。
os.path.exists()不出所料地报告找不到文件。
NTFS 将文件名存储为 Unicode。我确信如果我使用了win32api CreateFile() 系列函数,我会得到我的 Unicode 文件名,但是这些 API 太麻烦(而且不可移植)。我希望我得到 utf-8 编码的文件名,或者 FS 目录结构中的 Unicode 字节,但在默认模式下,这似乎不会发生。
我尝试过使用setlocale(),但我还没有找到正确的参数来使我的程序正常工作。我不想(也不能)在 Windows 机器上安装额外的代码页。这需要与 Windows 的库存安装一起使用。
请注意,这与控制台无关。 repr() 表明 ?以os.listdir('.') 列出的文件名结尾的字符是真正的问号,而不是一些显示伪影。我假设它们是由listdir() 在后台使用的 API 添加的。
【问题讨论】:
-
你想用 Python 打开文件吗?
-
@MelvinAbraham 是的。
-
@Keely “Unicode 文件名”是什么意思? Windows 默认使用 Unicode。文件名是 Unicode。字符串是 Unicode。它们没有什么困难、麻烦或不可移植的——所有 Windows 程序都可以很好地使用它们。您是否尝试在 Python 代码中使用 ANSI 字符串 并使用错误的代码页?
-
@Keely 是的,你做了
The listed filename is full of question marks.。这些是错误替换字符。这意味着您使用了一个使用一个代码页的 ANSI 字符串,但您的程序使用 另一个 不兼容的代码页运行。如果您使用例如挪威字符,您会遇到同样的问题。任何无法翻译的字符都被替换为?。解决方案是不使用代码页。 -
+10 到 Melvin 所说的 - 控制台使用用户/系统的区域设置显示文本。字符串可能没问题,但会显示替换字符。您可以更改 console 的 区域设置,甚至将其切换为 65536 (UTF8),但这不会影响程序的实际运行方式,只会影响 console 处理文本的方式。
标签: python windows unicode ntfs