MLDonkey 下载中文文件乱码解决办法

来源:互联网 发布:cf领枪手机软件 编辑:程序博客网 时间:2024/04/29 21:46

MLDonkey 下载中文文件乱码解决办法

 

作者:kongxx

MLDonkey是目前在Linux上比较流行的Donkey,但是其核心类库不能很好的处理中文,这一点也让很多中国的养驴专业户望而却步,以下是我在使用MLDonkey的过程中处理文件有中文的一个方法,但是此方法只是在文件下载完后执行转换,在下载过程中仍然不能看到中文,这一点我会在以后想办法处理:

注意:当前版本只支持在添加文件时将一个中文编码为两个字节的情况。

此方法使用的是Java语言编写的一个类作的处理,代码如下:

import java.net.*;

import java.io.*;

 

public class MLDonkeyUtil {

       /**

        * mldonkey文件下载存放路径

        */

       private String incoming = "/usr/local/mldonkey/incoming"; 

 

       public static void main(String[] args) throws Exception {         

              MLDonkeyUtil util = new MLDonkeyUtil(); 

              util.convert();

       }

 

       private void convert() {

              File dir = new File(incoming);

              File[] files = dir.listFiles() ;

              for(int i = 0 ; i < files.length ; i++) {                  

                     String strDest = convert(files[i].getName());

                     if(!files[i].getName().equals(strDest)) {

                            print(files[i].getName() + "  >>>  " + strDest);

                            File fDest = new File(files[i].getParent() + File.separator + strDest);

                            files[i].renameTo(fDest) ;

                     }                                       

              }

       }

      

       private String convert(String s) {        

              int location = 0;

              String ret = "";

              while(true) {

                     if(location + 8 <= s.length() ) {

                            String subStr = s.substring(location ,location + 8);                          

                            if(check(subStr)) {

                                   ret += "%" + convert2Hex(subStr.substring(1, 4)) + "%"

                                                 + convert2Hex(subStr.substring(5, 8));

                                   location = location + 8 ;

                            } else {

                                   ret += s.substring(location ,location + 1);

                                   location = location + 1;

                            }

                     } else {

                            ret += s.substring(location );

                            break ;

                     }

              }

              return URLDecoder.decode(ret) ;

       }

      

       /**

        * 检查匹配类型(_nnn_nnn

        * @param s

        * @return

        */

       private boolean check(String s) {

              if(s.length() != 8) {

                     return false ;

              }

 

              if(s.charAt(0) != '_' || s.charAt(4) != '_') {

                     return false ;

              }

 

              if( isNum(s.charAt(1)) && isNum(s.charAt(2)) && isNum(s.charAt(3))

                            && isNum(s.charAt(5)) && isNum(s.charAt(6)) && isNum(s.charAt(7))) {

                     return true ;

              }

              return false ;

       }

      

       private boolean isNum(char c ) {

              if(c >= 48 && c <= 57) {

                     return true ;

              }

              return false ;

       }

      

       private String convert2Hex(String s) {

              int i = Integer.parseInt(s);

              if(i < 0 || i > 255) {

                     throw new IllegalArgumentException();

              }           

              return Integer.toHexString(i);

       }

 

       private void print(String str) {

              System.out.println(str);

       }    

}

将此类中的incoming 改为MLDonkey incoming目录,然后再Linux命令行输入以下命令进行编译和执行。

编译

#javac MLDonkeyUtil.java

执行

#java MLDonkeyUtil

如果目录下有需要改中文名的文件,此程序会自动转换,并输出转换前后文件的名称。

原创粉丝点击