Ste*_*der 10 python unicode winapi pywin32
题
似乎PyWin32很容易将以null结尾的unicode字符串作为返回值.我想以'正确'的方式处理这些字符串.
假设我得到一个字符串:u'C:\\Users\\Guest\\MyFile.asy\x00\x00sy'.这似乎是在Python unicode对象中挂出的C样式的以null结尾的字符串.我想把这个坏男孩修剪成一个常规的字符串,例如,我可以在窗口标题栏中显示.
在第一个空字节处修剪字符串是否正确处理它?
我没想到得到这样的返回值,所以我想知道我是否遗漏了一些关于Python,Win32和unicode如何一起玩的重要内容......或者这是否只是一个PyWin32错误.
背景
我正在使用GetOpenFileNameWPyWin32包中的Win32文件选择器函数.根据文档,此函数返回一个包含完整文件名路径的元组作为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结尾的字符串.
方向:在对话框中将文件名更改为"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)
Run Code Online (Sandbox Code Playgroud)
注意:如果您没有足够缩短文件名(例如,如果您尝试MyFileIsReally.asy),则字符串将在没有空字节的情况下完成.
环境
Windows 7 Professional 64位(无服务包),Python 2.7.1,PyWin32 Build 216
更新:PyWin32 Tracker神器
基于我到目前为止收到的评论和答案,这可能是一个pywin32错误,所以我提交了一个跟踪器工件.
更新2:修复!
Mark Hammond在追踪器工件中报告说这确实是一个错误.一个修复程序已检入rev f3fdaae5e93d,所以希望这将成为下一个版本.
我认为Aleksi Torhamo的答案是解决之前PyWin32版本的最佳解决方案.
我会说这是一个错误.处理它的正确方法可能是修复pywin32,但如果你没有足够的冒险精神,只需修剪它.
您可以前先搞定一切'\x00'用filename.split('\x00', 1)[0].
| 归档时间: |
|
| 查看次数: |
4835 次 |
| 最近记录: |