Mal*_*olm 2 python ftp unicode file
有人可以证实了Python 2.6 FTPLIB不会不支持Unicode文件名?或者必须对Unicode文件名进行特殊编码才能与ftplib模块一起使用?
以下电子邮件交换似乎支持我的结论,即ftplib模块仅支持ASCII文件名.
ftplib应该使用UTF-8而不是latin-1编码吗? http://mail.python.org/pipermail/python-dev/2009-January/085408.html
有关支持Unicode文件名的第三方Python FTP模块的任何建议?我用谷歌搜索了这个问题没有成功[1],[2].
官方Python文档没有提到Unicode文件名[3].
谢谢你,马尔科姆
[1] ftputil包装ftplib并继承了ftplib明显的ASCII支持?
[2] Paramiko的SFTP库确实支持Unicode文件名,但我正在寻找相对于我们当前项目的ftp(与sftp)支持.
[3] http://docs.python.org/library/ftplib.html
解决方法:
encodings.idna.ToASCII和.ToUnicode方法可用于将Unicode路径名转换为ASCII格式.如果使用这些函数包装所有远程路径名和dir/nlst方法的输出,那么您可以创建一种使用标准ftplib保留Unicode路径名的方法(并且还保留不在文件系统上的Unicode文件名)支持Unicode路径).这种技术的缺点是,当引用您上传到服务器的文件时,服务器上的其他进程也必须使用encodings.idna.顺便说一句:我知道这是对encodings.idna库的滥用.
感谢Peter和Bob的评论,我发现这些评论非常有帮助.
ftplib不知道任何Unicode.它旨在传递文件名的字节字符串,并在被要求提供目录列表时返回字节字符串.这些是从服务器传递给/返回的字节的确切字符串.
如果你ftplib在Python 2.x中传递一个Unicode字符串,当它被发送到底层套接字对象时,它最终会被强制转换为字节.这种强制使用Python的"默认"编码,即.安全的US-ASCII,为非ASCII字符生成异常.
您链接的python-dev消息ftplib在Python 3.x中讨论,其中字符串默认为Unicode.这使得模块ftplib处于棘手的状态,因为虽然它们现在在其前端使用Unicode字符串,但它背后的实际协议是基于字节的.因此,必须涉及额外的编码/解码级别,并且没有明确的干预来指定正在使用的编码,有一个公平的改变它会选择错误.
ftplib3.x中选择默认为ISO-8859-1,以便将每个字节保留为Unicode字符串中的字符.不幸的是,这会在目标服务器对文件名使用UTF-8排序规则的常见情况下产生意外结果(无论FTP守护程序本身是否知道文件名是UTF-8,它通常不会这样).有很多这样的情况,Python标准库被粗暴地攻击到Unicode字符串,带来负面后果; 包含Python 3的电池仍在泄漏腐蚀性液体IMO.