问题
Pywin32似乎乐于将以空结尾的Unicode字符串作为返回值。我想以“正确”的方式处理这些字符串。
假设我得到一个字符串,比如:u'C:\\Users\\Guest\\MyFile.asy\x00\x00sy'。这似乎是一个C样式的空终止字符串,挂在一个python unicode对象中。我想把这个坏孩子剪成一个普通的ol'字符串,例如,我可以在窗口标题栏中显示。
在第一个空字节处修剪字符串是处理它的正确方法吗?
我没想到会得到这样的返回值,所以我想知道我是否遗漏了一些关于python、win32和unicode如何一起使用的重要信息…或者如果这只是一个pywin32错误。
背景
我正在使用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风格的以空结尾的字符串。
演示代码
以下代码演示了getsavefilenamew返回值中以空结尾的字符串。
说明:在对话框中将文件名更改为“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),那么字符串将是完整的,没有空字节。
环境
Windows 7专业版64位(无Service Pack),python 2.7.1,pywin32 build 216
更新:pywin32跟踪程序项目
根据我目前收到的评论和答案,这可能是一个pywin32错误,因此我提交了一个tracker artifact
更新2:已修复!
马克·哈蒙德在跟踪器中报告说这确实是一个错误。修订版f3fdaae5e93d已经签入,所以希望这将成为下一个版本。
我认为Aleksi Torhamo下面的答案是修复之前Pywin32版本的最佳解决方案。

最佳答案

我想说是个虫子。处理它的正确方法可能是修复pywin32,但如果您觉得不够冒险,只需修剪它。
您可以在第一次使用'\x00'之前获取所有内容。

07-24 15:04