Python使用ftplib上传含西欧字符文件到FTP后文件名乱码如何解决
问题根源
- 你遇到的
müde_Mäuschen是典型的编码错位错误:ü、ä这类西欧字符的UTF-8编码内容,被强制按照Latin-1(ISO-8859-1)解码就会生成这类乱码 - Python标准库的
ftplib默认使用Latin-1编码处理FTP命令中的文件名,而你的FTP服务器是按照UTF-8规则解析文件名的,编码规则不匹配就会出现乱码 - FileZilla上传正常是因为它默认开启了UTF-8编码传输文件名的配置,和服务器编码规则匹配
修复方案
方案1:修改ftplib默认编码(优先推荐)
直接修改FTP实例的encoding属性为utf-8即可,和服务器编码规则对齐,修改后的代码如下:
from ftplib import FTP import os ftp = FTP("Login Details") # 新增行:指定文件名使用UTF-8编码传输 ftp.encoding = "utf-8" path = r'D:\ftp_test' file_name = 'müde_Mäuschen.jpg' # 推荐用os.path.join拼接路径,兼容不同系统的路径分隔符 with open(os.path.join(path, file_name), "rb") as f: ftp.storbinary(f"STOR {file_name}", f) # 操作完成后关闭FTP连接 ftp.quit()
方案2:手动转码(仅方案1不生效时使用)
部分特殊场景下设置encoding属性不生效的话,可以手动对文件名做转码处理:将文件名按UTF-8编码后再按Latin-1解码,伪装成Latin-1字符串传给ftplib,服务器收到后按Latin-1解码就能还原出正确的UTF-8文件名:
file_name = 'müde_Mäuschen.jpg' # 手动转码处理文件名 encoded_filename = file_name.encode("utf-8").decode("latin-1") with open(os.path.join(path, file_name), "rb") as f: ftp.storbinary(f"STOR {encoded_filename}", f)
内容的提问来源于stack exchange,提问作者yf879
相关产品推荐
相关产品推荐

