问题
看起来 PyWin32 能够返回以空字符结尾的 Unicode 字符串。我想正确地处理这些字符串。
假设我得到一个字符串:u'C:\\Users\\Guest\\MyFile.asy\x00\x00sy'
,这似乎是一个 C 风格的以 null 结尾的字符串存在 Python Unicode 对象中。我希望将其修剪为常规的字符字符串,例如显示在窗口标题栏中。
在第一个 null 字节处修剪该字符串是否是正确的方法?
我没有预料到会得到这样的返回值,所以我想知道我是否错过了关于 Python、Win32 和 Unicode 如何一起使用的重要信息...或者这只是一个 PyWin32 的 bug。
背景
我正在使用 PyWin32 包中的 Win32 文件选择器函数 GetOpenFileNameW
。根据文档,此函数返回一个包含完整文件名路径的 Python Unicode 对象的元组。
当我打开对话框并设置现有路径和文件名时,我得到了奇怪的返回值。
例如,我将默认设置为:C:\\Users\\Guest\\MyFileIsReallyReallyReallyAwesome.asy
在对话框中,我将名称更改为MyFile.asy
并单击保存。
返回值的完整路径部分为:u'C:\Users\Guest\MyFile.asy\x00wesome.asy'
我期望它是:u'C:\\Users\\Guest\\MyFile.asy'
该函数返回一个未修剪终止字节的重复使用的缓冲区。不用说,我的代码的其余部分没有为处理 C 风格的以 null 结尾的字符串进行设置。
演示代码
以下代码演示了从 GetSaveFileNameW 的返回值中获取 null-terminated 字符串。
操作步骤:在对话框中将文件名更改为“ MyFile.asy”,然后单击“保存”。观察输出到控制台的内容。我得到的输出是 u'C:\\Users\\Guest\\MyFile.asy\x00wesome.asy'
。
import win32gui, win32con
if __name__ == "__main__":
initial_dir = 'C:\\Users\\Guest'
initial_file = 'MyFileIsReallyReallyReallyAwesome.asy'
filter_string = 'All Files\0*.*\0'
(filename, customfilter, flags) = \
win32gui.GetSaveFileNameW(InitialDir=initial_dir,
Flags=win32con.OFN_EXPLORER, File=initial_file,
DefExt='txt', Title="Save As", Filter=filter_string,
FilterIndex=0)
print repr(filename)
注意: 如果您没有将文件名缩短足够(例如,如果您尝试使用 MyFileIsReally.asy),则字符串将完整输出而不包含null字节。
环境
Windows 7 Professional 64位(无服务包),Python 2.7.1,PyWin32 Build 216
更新:PyWin32跟踪工件
根据我收到的评论和答案,这很可能是一个pywin32 bug,因此我提交了一个跟踪工件。
更新2:已修复!
Mark Hammond在跟踪工件中报告说,这确实是一个bug。修复程序已经检入f3fdaae5e93d版本,因此希望下一个发行版会解决该问题。
我认为Aleksi Torhamo在下面的答案是PyWin32修复之前版本的最佳解决方案。