如何以"正确"的方式处理具有空字节的Python unicode字符串?

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版本的最佳解决方案.

Ale*_*amo 6

我会说这是一个错误.处理它的正确方法可能是修复pywin32,但如果你没有足够的冒险精神,只需修剪它.

您可以前先搞定一切'\x00'filename.split('\x00', 1)[0].