前提:Java代码的编码为GBK,数据库编码也为GBK
原因:
FTP协议里面,规定文件名编码为iso-8859-1,所以目录名或文件名需要转码。
解决方法
- 将中文的目录或文件名转为iso-8859-1编码的字符
- 设置linux环境变量
controlEncoding:Java代码中,文件上传/下载前的编码配置------------------------------保证ftp服务器编码 和 ftp上传/下载时controlEncoding编码一致
export LC_ALL=zh_CN.contrlEncoding
export LANG=zh_CN.controlEncoding
ftp服务器,文件上传/下载前设置的setControlEncoding,文件上传/下载前文件名fileName 3类编码格式
文件上传:
** FTP ** | ** ControlEncoding ** | ** fileName ** | ** 结果 ** |
---|---|---|---|
UTF-8 | UTF-8 | – | 乱码 |
UTF-8 | UTF-8 | fileName.getBytes(“GBK”),“iso-8859-1” 由GBK转为iso-8859-1编码 |
乱码 |
UTF-8 | UTF-8 | fileName.getBytes(“UTF8”),“iso-8859-1” 由UTF-8转为iso-8859-1编码 |
正常 |
GBK | GBK | – | 乱码 |
GBK | GBK | fileName.getBytes(“UTF-8”),“iso-8859-1” 由UTF-8转为iso-8859-1编码 |
乱码 |
GBK | GBK | fileName.getBytes(“GBK”),“iso-8859-1” 由GBK转为iso-8859-1编码 |
正常 |
文件下载: 根据文件名,从ftp服务器上获取文件
** FTP ** | ** ControlEncoding ** | ** fileName ** | ** 结果 ** |
---|---|---|---|
UTF-8 | UTF-8 | – | 乱码 |
UTF-8 | UTF-8 | fileName.getBytes(“GBK”),“iso-8859-1” 由GBK转为iso-8859-1编码 |
乱码 |
UTF-8 | UTF-8 | fileName.getBytes(“UTF8”),“iso-8859-1” 由UTF-8转为iso-8859-1编码 |
正常 |
GBK | GBK | – | 乱码 |
GBK | GBK | fileName.getBytes(“UTF-8”),“iso-8859-1” 由UTF-8转为iso-8859-1编码 |
乱码 |
GBK | GBK | fileName.getBytes(“GBK”),“iso-8859-1” 由GBK转为iso-8859-1编码 |
正常 |