Python中文
首页
教程
问答
标签
搜索
登录
注册
如何以“正确”的方式处理带有nullbytes的Python unicode字符串?
回答此问题可获得
20
贡献值,回答如果被采纳可获得
50
分。
<p><strong>问题</strong></p> <p>PyWin32似乎很乐意将以null结尾的unicode字符串作为返回值。我想用“正确”的方式处理这些字符串。在</p> <p>假设我得到一个字符串:<code>u'C:\\Users\\Guest\\MyFile.asy\x00\x00sy'</code>。这似乎是一个C风格的空结束字符串挂在Python unicode对象中。我想把这个坏小子精简成一个普通的字符串,比如,在窗口标题栏中显示。在</p> <p>在第一个空字节处修剪字符串是正确的处理方法吗?在</p> <p>我没想到会得到这样的返回值,所以我想知道我是否遗漏了一些关于Python、Win32和unicode如何协同工作的重要信息。。。或者这只是一个PyWin32错误。在</p> <p><strong>背景</strong></p> <p>我正在使用PyWin32包中的Win32文件选择器函数<a href="http://docs.activestate.com/activepython/2.7/pywin32/win32gui__GetSaveFileNameW_meth.html" rel="nofollow">^{<cd2>}</a>。根据文档,此函数返回一个元组,该元组包含Python unicode对象的完整文件名路径。在</p> <p>当我用现有的路径和文件名集打开对话框时,我得到一个奇怪的返回值。在</p> <p>例如,我将默认设置为:<code>C:\\Users\\Guest\\MyFileIsReallyReallyReallyAwesome.asy</code></p> <p>在对话框中,我将名称改为<code>MyFile.asy</code>,然后单击保存。在</p> <p>返回值的完整路径部分是:u'C:\Users\Guest\我的文件.asy\x00型韦索姆。阿西'`</p> <p>我希望它是:<code>u'C:\\Users\\Guest\\MyFile.asy'</code></p> <p>函数返回一个回收的缓冲区而不删减终止字节。不用说,我的其余代码并不是为处理C风格的以null结尾的字符串而设置的。在</p> <p><strong>演示代码</strong></p> <p>下面的代码演示GetSaveFileNameW返回值中以null结尾的字符串。在</p> <p>说明:在对话框中,将文件名改为'我的文件.asy'然后单击“保存”。观察控制台上打印的内容。我得到的输出是<code>u'C:\\Users\\Guest\\MyFile.asy\x00wesome.asy'</code>。在</p> <pre><code>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) </code></pre> <p>注意:如果文件名不够短(例如,如果您尝试我的文件是really.asy)字符串将是完整的,没有空字节。在</p> <p><strong>环境</strong></p> <p>Windows 7 Professional 64位(无服务包)、Python 2.7.1、PyWin32 Build 216</p> <p><strong>更新:PyWin32 Tracker工件</strong></p> <p>根据我目前收到的评论和答案,这很可能是一个pywin32错误,所以我提交了一个<a href="https://sourceforge.net/tracker/?func=detail&aid=3277647&group_id=78018&atid=551954" rel="nofollow">tracker artifact</a>。在</p> <p><strong>更新2:修复!</strong></p> <p>马克·哈蒙德在《追踪器人工制品》中报告说,这确实是一个bug。修订版f3fdaae5e93d中签入了一个修复程序,因此希望这将成为下一个版本。在</p> <p>我认为Aleksi Torhamo下面的答案是修复之前PyWin32版本的最佳解决方案。在</p>
0 条评论
分类:
Python问答
请先
登录
后评论
默认排序
时间排序
1 个回答
匿名
1天前
擅长:python、mysql、java
<p>在我测试的PyWin32/Windows/Python版本上不会发生这种情况;即使返回的字符串很短,我也不会得到任何空值。您可能会调查以上某个更新版本是否修复了该错误。在</p>
请先
登录
后评论
针对此问题:
更多的回答
关注
89
关注
收藏
1
收藏,
216
浏览
网友 提问于 2天前
相关Python问题
无法使用Django/mongoengine连接到MongoDB(身份验证失败)
5 回答
无法使用Django\u mssql\u后端迁移到外部hos
10 回答
无法使用Django&Python3.4连接到MySql
4 回答
无法使用Django+nginx上载媒体文件
9 回答
无法使用Django1.6导入名称模式
9 回答
无法使用Django1.7和mongodb登录管理站点
9 回答
无法使用Djangoadmin创建项目,进程使用了错误的路径,因为我事先安装了错误的Python
7 回答
无法使用Djangockedi验证CBV中的字段
3 回答
无法使用Djangocketditor上载图像(错误400)
5 回答
无法使用Djangocron进行函数调用
1 回答
无法使用Djangofiler djang上载文件
3 回答
无法使用Djangokronos
1 回答
无法使用Djangomssql provid
3 回答
无法使用Djangomssql连接到带有Django 1.11的MS SQL Server 2016
7 回答
无法使用Djangomssq迁移Django数据库
2 回答
无法使用Djangonox创建用户
1 回答
无法使用Djangopyodb从Django查询SQL Server
9 回答
无法使用Djangopython3ldap连接到ldap
8 回答
无法使用Djangoredis连接到redis
7 回答
无法使用Django中的FK创建新表
2 回答