将十六进制Unicode编码字符串文件转换为可读文件的Java程序

时间:2023-01-10 22:13:02

事情起因就是我手头有好些文件都带有Unicode编码字符串,具体显示效果是这样的:”\u51fd\u6570\u529f\u80fd\uff1a\u8df3\u8f6c\u81f3\u5176\u4ed6\u9875\u9762“。

嗯,很糟糕,这样是不能看的,所以我简单的写了个程序,自动转换一下带十六进制Unicode编码字符串文件,支持文件夹嵌套。没准以后还能用着,就稍微整理了一下。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class test {

/**
* 将带十六进制Unicode编码字符串文件转换为可读文件
* @param res 源文件
* @param tar 目标文件
*/
public static void changeFile(File res, File tar) {
if(res != null && res.isFile()) {
try {
FileInputStream fis = new FileInputStream(res);
FileOutputStream fos = new FileOutputStream(tar);
byte[] buff = new byte[fis.available()];

while (fis.read(buff) != -1) {
String s = new String(buff);
s = test.unicodeToString(s);
fos.write(s.getBytes(), 0, s.getBytes().length);
}
fos.close();
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

/*
* 把中文字符串转换为十六进制Unicode编码字符串
*/
public static String stringToUnicode(String s) {
String str = "";
for (int i = 0; i < s.length(); i++) {
int ch = (int) s.charAt(i);
if (ch > 255)
str += "\\u" + Integer.toHexString(ch);
else
str += "\\" + Integer.toHexString(ch);
}
return str;
}

/*
* 把十六进制Unicode编码字符串转换为中文字符串
*/
public static String unicodeToString(String str) {
Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");
Matcher matcher = pattern.matcher(str);
char ch;
while (matcher.find()) {
ch = (char) Integer.parseInt(matcher.group(2), 16);
str = str.replace(matcher.group(1), ch + "");
}
return str;
}

/**
* 递归列出所有文件名
*/
public static void listFile(List<String> list, File path){
if(path != null && path.isDirectory()) {
File[] files = path.listFiles();
for(File file : files) {
if(!file.isDirectory()) {
list.add(path.toString() + "\\" +file.getName());
}else {
listFile(list, file);
}
}
}
}

/**
* 将带十六进制Unicode编码字符串文件转换为可读文件,每一个可读文件后缀加上了“.changed”
*/
public static void main(String[] args) {
File res = null;
File tar = null;

String filePath = "目录路径";
File path = new File(filePath);
List<String> list =new ArrayList<String>();
listFile(list, path);
for (String str : list) {
res = new File(str);
tar = new File(str + ".changed");
changeFile(res, tar);
}

System.out.println("执行完成");
}
}


附带一点正则表达式的知识:

正则表达式中Matchergroup()start()end()带参方法解析:

http://hi.baidu.com/cnjsp/blog/item/f5449d824c5102b46c8119cb.html 

关于正则表达式问题:

http://topic.csdn.net/t/20051223/21/4478391.html 

揭开正则表达式的神秘面纱:

http://www.regexlab.com/zh/regref.htm