java自动识别网站 文件的编码 博客分类: 编程应用 Java.net
程序员文章站
2024-03-23 23:20:40
...
通过文件流操作某个文件的时候,经常得到的是一堆乱码(中文乱码),如下面的一段代码运行后出现乱码,见图1
import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; public class CsvDemo { public static void readFile(String file, String code) { BufferedReader fr; try { String myCode = code!=null&&!"".equals(code) ? code : "UTF8"; InputStreamReader read = new InputStreamReader(new FileInputStream( file), myCode); fr = new BufferedReader(read); String line = null; int flag=1; // 读取每一行,如果结束了,line会为空 while ((line = fr.readLine()) != null && line.trim().length() > 0) { if(flag==1) { line=line.substring(1);//去掉文件头 flag++; } // 每一行创建一个Student对象,并存入数组中 System.out.println(line); } fr.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String file = "E:/5bb.312.1363@@.csv"; String file1 = "E:/MODELF-F0000_1.csv"; readFile(file, "GB2312"); // readFile(file1, file1Code); // readFile(file, "GB2312"); // System.out.println(BytesEncodingDetect.nicename[s.detectEncoding(new File(file1))]); // System.out.println(BytesEncodingDetect.nicename[s.detectEncoding(new File(file))]); } }
图1
原因: 字符集编码指定有误
难题: 怎样让程序自动识别文件的编码呢?如果知道了文件的编码,则动态的传递到程序中去,达到正确识别文件的目的
解决: 从网络上搜索到这样一个类“BytesEncodingDetect.java”(在附件中),可以达到目的。
下面是经调试后的源程序代码及正确识别文件后的截图 图2
import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; public class CsvDemo { public static void readFile(String file, String code) { BufferedReader fr; try { String myCode = code!=null&&!"".equals(code) ? code : "UTF8"; InputStreamReader read = new InputStreamReader(new FileInputStream( file), myCode); fr = new BufferedReader(read); String line = null; int flag=1; // 读取每一行,如果结束了,line会为空 while ((line = fr.readLine()) != null && line.trim().length() > 0) { if(flag==1) { line=line.substring(1);//去掉文件头 flag++; } // 每一行创建一个Student对象,并存入数组中 System.out.println(line); } fr.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub BytesEncodingDetect s = new BytesEncodingDetect(); String file = "E:/5bb.312.1363@@.csv"; String file1 = "E:/MODELF-F0000_1.csv"; //得到文件的编码 String fileCode = BytesEncodingDetect.nicename[s.detectEncoding(new File(file))]; String file1Code = BytesEncodingDetect.nicename[s.detectEncoding(new File(file1))]; readFile(file, fileCode); // readFile(file1, file1Code); // readFile(file, "GB2312"); // System.out.println(BytesEncodingDetect.nicename[s.detectEncoding(new File(file1))]); // System.out.println(BytesEncodingDetect.nicename[s.detectEncoding(new File(file))]); } }
图2
BytesEncodingDetect.java该类的其他用法,还有
BytesEncodingDetect s = new BytesEncodingDetect(); String str = "??¤¤¤å"; System.out.println(BytesEncodingDetect.nicename[s.detectEncoding(str.getBytes("ISO-8859-1"))]); System.out.println(new String(str.getBytes("ISO-8859-1"), "BIG5")); System.out.println(BytesEncodingDetect.nicename[s.detectEncoding("Java世纪网".getBytes())]); System.out.println(BytesEncodingDetect.nicename[s.detectEncoding(new URL("http://www.java2000.net"))]);
类文件BytesEncodingDetect.java和测试代码见附件
下一篇: 注册事件的两种方式