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);
}
}
}
}
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. 如果我打包读取class文件的字符集,如果本地系统是window,是用Windows系统默认的字符集,跟我eclipse中设置的字符集没有关系;
2. 如果是上述情况,eclipse中设置的字符集,只是针对eclipse展示么,还是针对.Java源文件。
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编码的中文就看不到了