gpt4 book ai didi

python - 确认 Python 2.6 ftplib 不支持 Unicode 文件名?备择方案?

转载 作者:行者123 更新时间:2023-11-28 20:11:31 25 4
gpt4 key购买 nike

有人可以确认 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 文件名的第 3 方 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 一无所知。它旨在传递文件名的字节字符串,并在要求目录列表时返回字节字符串。这些是传递给服务器/从服务器返回的字节的确切字符串。

如果您在 Python 2.x 中将 Unicode 字符串传递给 ftplib,当它被发送到底层套接字对象时,它最终会被强制转换为字节。这种强制使用 Python 的“默认”编码,即。用于安全的 US-ASCII,非 ASCII 字符生成异常。

您链接到的 python-dev 消息正在谈论 Python 3.x 中的 ftplib,其中字符串默认为 Unicode。这使得像 ftplib 这样的模块处于一个棘手的境地,因为尽管它们现在在前端使用 Unicode 字符串,但其背后的实际协议(protocol)是基于字节的。因此,必须涉及额外级别的编码/解码,并且在没有明确干预来指定正在使用的编码的情况下,有一个公平的变化它会选择错误。

3.x 中的

ftplib 选择默认为 ISO-8859-1,以便将每个字节保留为 Unicode 字符串中的一个字符。不幸的是,在目标服务器对文件名使用 UTF-8 排序规则的常见情况下,这会产生意想不到的结果(无论 FTP 守护程序本身是否知道文件名是 UTF-8,而它通常不会)。有许多这样的案例,其中 Python 标准库被粗暴地破解为 Unicode 字符串,造成了负面后果; Python 3 的电池仍在泄漏腐 eclipse 性液体 IMO。

关于python - 确认 Python 2.6 ftplib 不支持 Unicode 文件名?备择方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3120295/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com