2008-09-26

sun.net.ftp.FtpClient 编码问题解决

使用 sun.net.ftp.FtpClient 在遇到中文文件名和中文目录名时会出现些问题。

  1. list() 得到的文件名乱码,这个很好解决:

    /**
    * 字符编码转换:ISO-8859-1 => GBK
    *
    * @param str
    * @return
    * @throws UnsupportedEncodingException
    */
    public static String iso2Gbk(String str)
    throws UnsupportedEncodingException {
    return new String(str.getBytes("ISO-8859-1"), "GBK");
    }


  2. 遇到某中文目录时会无法进入,这个问题困扰我好几天(这几天一直在摆弄这个)。
    发现服务端接收到的中文目录名都成乱码了,一开始我以为通过 new String() 的方式也可以解决。
    其实不然,怎么试都不行,好象在 sun.net.ftp.FtpClient 里面会自动转换成 ISO 的编码。
    今天偶然有机会看到 sun.net.ftp.FtpClient 的源码才发现果然如此。
    sun.net.ftp.FtpClient 有个超类 sun.net.NetworkClient 在里面会将所有传输出去的编码都转换成 ISO 的。看来问题出在这里了。
    同时 sun.net.NetworkClient 还有个:

    /* Name of encoding to use for output */
    protected static String encoding;

    这个可以控制其编码,于是乎:

    /**
    * 设置连接编码
    *
    * @param encodingStr
    */
    public static void setEncoding(String encodingStr) {
    sun.net.NetworkClient .encoding = encodingStr;
    }

    将编码设置成 GBK 问题即解决。


至此,遇到的两个编码问题都已解决,一切都是那么轻松 ^_^ 。

//EOF

0 comments: