首先说下UTF-8格式和UTF-8无BOM格式的区别。
两者的区别就是UTF-8格式的文件,在第一行的开始位置,会有个标志位,一般工具是无法看到的,占3个字节。而UTF-8无BOM格式的文件,顾名思义,就是没有这个标志位。
先说下从UTF-8文件转换成UTF-8无BOM格式文件
相信很多朋友都有过这样的经历,读取UTF-8格式的文件的时候,中文会变成乱码,明明在java代码里指定了读取文件使用的流编码格式为UTF-8,但是读出来的内容,中文还是会变乱码。也有的时候会发现,最终输出的文件中首行开始的位置会莫名其妙多个“?”问号。原因就是这个BOM标志位,没有处理好的原因。在网上也看了很多帖子,很多的解决方法。但是每个人都有自己喜欢的解决方法。至于哪种好,哪种坏,取决于个人。
我的方法是使用
public static void main(String[] args) throws IOException {
File file=new File("D:\\test.txt");
File targetFile=new File("D:\\result.txt");
if(!targetFile.exists())
{
targetFile.createNewFile();
}
BufferedReader br=null;
BufferedWriter bw=null;
br=new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));
bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(targetFile),"UTF-8"));
int i=0;
String str="";
while((str=br.readLine())!=null)
{
if(i==0)//读取第一行,将前三个字节去掉,重新new个String对象
{
byte[] bytes=str.getBytes("UTF-8");
str=new String(bytes,3,bytes.length-3);
bw.write(str);
i++;
}else
bw.write(str);
}
br.close();
bw.close();
}
UTF8无BOM格式的文件转换成UTF-8格式的文件。只需在输出首行内容的时候,增加个\uFEFF 标志位就可以
public static void main(String[] args) throws IOException {
File file=new File("D:\\result.txt");
File targetFile=new File("D:\\utf8.txt");
if(!targetFile.exists())
{
targetFile.createNewFile();
}
BufferedReader br=null;
BufferedWriter bw=null;
br=new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));
bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(targetFile),"UTF-8"));
int i=0;
String str="";
while((str=br.readLine())!=null)
{
if(i==0)// 在首行增加个BOM标志位
{
str="\uFEFF"+str;
bw.write(str);
i++;
}else
bw.write(str);
}
br.close();
bw.close();
}
总结:其实问题的关键就是。读取UTF-8文件时,要先舍掉前三个字节。想要输出UTF-8文件,就先向文件中写入\uFEFF