eclipse中设置文件java文件的字符集为UTF-8,使用java代码读取文件字符集时为jbk。
eclipse设置如下图:读取文件代码如下:
public class UncodeCheckThread {
private static List<File>utf8_Files = new ArrayList<File>();
private static List<File>gbk_Files = new ArrayList<File>();

private static Map<String, List<File>> map = new HashMap<String, List<File>>();

private static Set<String> set = new HashSet<String>();

public static Log log = LogFactory.getLog(UncodeCheckThread.class);

public static void main(String[] args) {
try {
// String filePath = "D:/wkspace/jindaitong/wjjdt/src";
// String filePath = "D:/wkspace/jindaitong/wjjdt/src/com/sinosoft/insure/tkonline";
String filePath = "D:/wkspace/jindaitong/wjjdt/ui/WEB-INF/classes/com/sinosoft/insure/tkonline";
// setSystemOut();
File directionary = new File(filePath);

getDirectionaryFiles(directionary);
System.out.println ("begin*****************************UTF-8字符集编码文件");
for(File file : utf8_Files){
System.out.println (file.getAbsolutePath());
}
System.out.println ("end*****************************UTF-8字符集编码文件,共:"+utf8_Files.size()+"个");

System.out.println ("-------------------------------------------------------------------------------------------------");
System.out.println ("begin*****************************GBK字符集编码文件");
for(File file : gbk_Files){
System.out.println (file.getAbsolutePath());
}
System.out.println ("end*****************************GBK字符集编码文件,共:"+gbk_Files.size()+"个");
System.out.println("begin*******************字符集编码开始:");
for(String unicode : set){
System.out.println(unicode);
}
System.out.println(set.size());
System.out.println("end*******************字符集编码结束");
} catch (Exception e) {
e.printStackTrace();
} }
private static void getDirectionaryFiles(File directionary) throws Exception{
File[] files = directionary.listFiles();
if(null != files){
for(File file : files){
getDirectionaryFiles(file);
}
}else{
if(directionary.getAbsolutePath().endsWith(".class")){
InputStream input = new FileInputStream(directionary);
byte[] b = new byte[3];
input.read(b);
input.close();

// set.add(b[0]+"~"+b[1]+"~"+b[2]);
BufferedInputStream bin = new BufferedInputStream( new FileInputStream(directionary));
int p = (bin.read() << 8) + bin.read();
bin.close();
String code = null;
        //其中的 0xefbb、0xfffe、0xfeff、0x5c75这些都是这个文件的前面两个字节的16进制数
        switch (p) {
            case 0xefbb:
                code = "UTF-8";
                break;
            case 0xfffe:
                code = "Unicode";
                break;
            case 0xfeff:
                code = "UTF-16BE";
                break;
            case 0x5c75:
             code = "ANSI|ASCII" ;
             break ;
            default:
                code = "GBK";
        }
        set.add(code);
        
      //对于UTF-8编码格式的文本文件,其前3个字节的值就是-17、-69、-65
if(b[0]==-17 && b[1]==-69 && b[2]==-65){
utf8_Files.add(directionary);
}else{
gbk_Files.add(directionary);
}
}

}
}

解决方案 »

  1.   

    Eclipses上面的字符集是在编译源文件的时候用的,java 执行时用的字符集是系统默认的。
      

  2.   

     你好,对于读取文件的字符集,我还是不太明白:
     1. 如果我打包读取class文件的字符集,如果本地系统是window,是用Windows系统默认的字符集,跟我eclipse中设置的字符集没有关系;
    2. 如果是上述情况,eclipse中设置的字符集,只是针对eclipse展示么,还是针对.Java源文件。
      

  3.   

     你好,对于读取文件的字符集,我还是不太明白:
     1. 如果我打包读取class文件的字符集,如果本地系统是window,是用Windows系统默认的字符集,跟我eclipse中设置的字符集没有关系;
    2. 如果是上述情况,eclipse中设置的字符集,只是针对eclipse展示么,还是针对.Java源文件。 你好,对于读取文件的字符集,我还是不太明白:
     1. 如果我打包读取class文件的字符集,如果本地系统是window,是用Windows系统默认的字符集,跟我eclipse中设置的字符集没有关系;
    2. 如果是上述情况,eclipse中设置的字符集,只是针对eclipse展示么,还是针对.Java源文件。1,Eclipse 要把你写的源文件翻译成机器二进制的机器语言,在eclipse读取源文件的时候,是按照eclipse自身设置的字符集读取的,比如你用的是gbk,那eclipse就会按照gbk字符集转换源文件到二进制机器语言,最后生成的class 文件都是机器语言命令,和字符集没有关系。
    2. 是针对源文件的,如果两个eclipse环境设置不同的字符集,一个gbk, 一个utf8,那么如果另一台机上没有gbk字符集,在源文件里用gbk编码的中文就看不到了