闲着没事情,写了个Unicode 转 中文字符 的class,对反编译含有中文的class大有好处
UnicodeToChinese.java
/*
* Created on 2003-6-5
* administrator
* TODO
*/
import java.util.*;
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.FileReader;
import java.io.File;
import java.io.FilenameFilter;
/**
* @author administrator
* 2003-6-5
* UnicodeToChinese.java
* @
* TODO
*/
public class UnicodeToChinese {
/**
*根据分割符分割字符串。
*Return String[],after split
*Split a String by a splitter(such as ",","hai",...)
* bug mailto:jasonxu@alibaba-inc.com
* @param sStr 将要被分割的字符串。
* @param sSplitter 分割符。
* @return 一个含有分割好的字符串的数组。
* 如果分割失败将返回null,如果字符串中没有包含指定的分割符,
* 将返回只有一个元素的字符串数组,
* 这个元素就是该字符串本身。如果这个字符串只含有分割符,
* 将返回单个空字符串的数组。
*/
public static String[] splitStr(String sStr, String sSplitter) {
if (sStr == null
|| sStr.length() <= 0
|| sSplitter == null
|| sSplitter.length() <= 0)
return new String[] { "" };
String[] saRet = null;
int iLen = sSplitter.length();
//we alloc the max length of int[] need,because a vector may be used more memory
int[] iIndex = new int[sStr.length()];
iIndex[0] = sStr.indexOf(sSplitter, 0);
if (iIndex[0] == -1) {
saRet = new String[1];
saRet[0] = sStr;
return saRet;
}
int iIndexNum = 1; //get the iIndex of all splitter substring
while (true) {
iIndex[iIndexNum] =
sStr.indexOf(sSplitter, iIndex[iIndexNum - 1] + iLen);
if (iIndex[iIndexNum] == -1)
break;
iIndexNum++;
}
Vector vStore = new Vector();
int i = 0;
String sub = null;
for (i = 0; i < iIndexNum + 1; i++) {
if (i == 0)
sub = sStr.substring(0, iIndex[0]);
else if (i == iIndexNum)
sub = sStr.substring(iIndex[i - 1] + iLen, sStr.length());
else
sub = sStr.substring(iIndex[i - 1] + iLen, iIndex[i]);
if (sub != null && sub.length() > 0)
vStore.add(sub);
}
if (vStore.size() <= 0)
return null; //only split,none string
saRet = new String[vStore.size()];
Enumeration e = vStore.elements();
for (i = 0; e.hasMoreElements(); i++)
saRet[i] = (String) e.nextElement();
return saRet;
}
public static String toChinese(String input) {
StringBuffer sb = new StringBuffer();
String[] Sinput = splitStr(input, "\\u");
if (Sinput.length <= 0)
return "";
String noUnicode = "";
String Unicode = "";
for (int i = 0; i < Sinput.length; i++) {
if (i == 0 && Sinput[i].indexOf("\"") >= 0) {
sb.append(Sinput[i]);
continue;
}
//满足4个字符
if (Sinput[i].length() >= 4) {
Unicode = Sinput[i].substring(0, 4);
//切除大于4个字符的尾部,作为noUnicode处理,直接输出
if (Sinput[i].length() > 4)
noUnicode = Sinput[i].substring(4, Sinput[i].length());
else
noUnicode = "";
try {
//对16进制的Unicode处理-->转化为10进制的int型。
int cha = Integer.parseInt(Unicode, 16);
//将10进制转化为short型
short mp = (short) cha;
//将short型转化为char输出
char tm = (char) mp;
sb.append(tm);
sb.append(noUnicode);
} catch (Exception e) {
//转化失败,表示这个Unicode 不符合转化成中文字符
//直接输出
sb.append(Sinput[i]);
}
}
//字符小于4,直接输出
else
sb.append(Sinput[i]);
}
return sb.toString();
}
public static void main(String[] args) {
if (args.length <= 1) {
System.out.println("=========参数不够===========");
System.exit(1);
}
try {
File file = new File(args[0]);
File[] Filelist = file.listFiles(new ExtensionFileFilter("java"));
String OutPutFileName;
System.out.println("======开始列出文件列表========");
for (int i = 0; i < Filelist.length; i++) {
System.out.println(Filelist[i].toURI());
}
System.out.println("===========--结束----========");
for (int i = 0; i < Filelist.length; i++) {
//if(list[i].indexOf(".java")<0) continue;
BufferedReader read =
new BufferedReader(new FileReader(Filelist[i]));
OutPutFileName =
Filelist[i].toString().substring(
Filelist[i].toString().lastIndexOf('\\') + 1);
FileWriter write =
new FileWriter(args[1] + "\\" + OutPutFileName);
String temp = null;
while ((temp = read.readLine()) != null) {
write.write(UnicodeToChinese.toChinese(temp) + "\n");
}
read.close();
write.flush();
write.close();
System.out.println(">" + Filelist[i].toString() + " 转化完成==========");
}
System.out.println("=======转化结束!!==========");
} catch (Exception e) {
e.printStackTrace();
}
}
}
**********************************************************************
ExtensionFileFilter.java
/*
* Created on 2003-6-5
* administrator
* TODO
*/
/**
* @author administrator
* 2003-6-5
* ExtensionFileFilter.java
* @
* TODO
*/
import java.io.File;
import java.io.FileFilter;
public class ExtensionFileFilter implements FileFilter {
private String extension;
public ExtensionFileFilter(String extension) {
this.extension = extension;
}
public boolean accept(File file) {
if(file.isDirectory( )) {
return false;
}
String name = file.getName( );
// find the last
int index = name.lastIndexOf(".");
if(index == -1) {
return false;
} else
if(index == name.length( ) -1) {
return false;
} else {
return this.extension.equals(name.substring(index+1));
}
}
}
*************************************************************************
这个东西可以支持一级目录操作,目前我把反编译的文件经过这个处理,感觉很不错。
除了这个用途我还想不出什么地方用的着的。
运行命令行如下(参考): java -classpath . UnicodeToChinese c:\classes\com c:\src\com
第一个参数是反编译以后的class目录 第二个参数是存放文件处理以后存放的目录
运行结果:
例如 : Unicode : \u5E78\u707E\u4E50\u7978 ---> 幸灾乐祸
所有含有 \u2323 都被转化成中文。有任何bug请联系siru.chen@alibaba-inc.com