如何解决GBK的编码的⽂件中的中⽂转换成为UTF-8编码的⽂件
⽽且不乱码
⾸先我们必须明确⼀点,为什么正常转换会乱码?
因为我们的数据写⼊是GBK写⼊的,然后展⽰的话是按照⽂件保存形势展⽰的,前⾯保存形势是GBK,⼀致,所以不乱码,⽽后⾯将保存形势变成了UTF-8,但是写⼊的内容是GBK形势的,编码解码⽅式不⼀致,所以产⽣乱码。
我们⼀般的解决乱码的思路是:
String s=new Bytes("GBK"),"UTF-8");
我将它解决的思路也是这样⼦的:
⾸先我们知道引起乱码的只是因为中⽂,中⽂乱码的⽅式看起来就是上⾯那样解决的。
将⽂件的编码改变,⽽且⾥⾯的内容的编写编码也随之改变,很显然不是单纯地对⽂件进⾏格式改变,改变格式的同时必定要改变⽂件的内容。
我的初步想法:
将⽂件内容读取到流中,然后按指定编码写⼊到⽬标⽂件中。
过程:
将⽬标⽂件取读到流中
读取源⽂件中的信息⽤字符串的形式展⽰,
将字符串写⼊⽬标⽂件
注意问题:
1、读取⽬标⽂件默认读取编码是当前项⽬编码⽽不是源⽂件编码,我们可以使⽤FileInputStream的含有编码⽅式的构造达到我们的要求
2、取读每⼀⾏字符串后的写⼊其实是不需要转换字符串格式的。就像我就犯了⼀个错误,我前⾯将读取成功的字符串通过new
String(getBytes("GBK"),"UTF-8");的形式再次写⼊⽂件中,导致⼀直乱码,忽略了⼀个问题,就是我
读取⽂件的时候其实已经解码了,此时字符串的编码⽅式应该就是我的项⽬编码⽅式了。
3、读取完⼀⾏数据记得的换⾏
其他的问题就是:
将⽂件夹中的所有指定⽂件都进⾏编码格式的改变,⼀个递归调⽤指定⽅法的过程罢了!
代码实现:
import org.apachemons.io.IOUtils;
import java.io.*;
import java.util.ArrayList;
/**
* Created by Administrator on 2016/12/1.
*/
url编码和utf8区别public class Test {
String ROUTE_URL="D:/test";
String srcEncode;
ArrayList<File> fileArray=new ArrayList<File>();
public void  trans(String filePath) throws Exception{
getFileClass(new File(filePath));
for (File file:fileArray){
AbsolutePath());
}
}
/**
* 将⽂件由GBK格式读取,UTF-8格式写⼊
* 运⾏的项⽬应该是UTF-8的项⽬
* filePath⽤相对路径⽅便转移。如果使⽤绝对路径⾃⼰改⼀下输出流的url
*/
public void  transEncode(String filePath) throws Exception{
File target=new File(ROUTE_URL,filePath);
FileInputStream fis=new FileInputStream(filePath);
BufferedReader br=new BufferedReader(new InputStreamReader(fis,srcEncode));        FileOutputStream fos=new FileOutputStream(target);
fos.flush();
fis.close();
fos.close();
}
/*
* 递归遍历指定⽬录下的指定后缀⽂件
*/
/*
* 返回值类型 void
* 参数列表⽂件夹File
* 出⼝条件:⽂件,后缀名是.class,如果排除的话加!即可.多个可使⽤全局变量
*
*/
public void getFileClass(File file){
File[] files=file.listFiles();
for(File f:files){
if(f.isDirectory()){
getFileClass(f);
}else{
Name().endsWith(".java") || f.getName().endsWith(".jsp")){
System.out.AbsolutePath());
fileArray.add(f);
}
}
}
}
}
View Code