/** * 判断文件的编码格式 * * @param sourceFile * @return */ private static String getFilecharset(File sourceFile) { String charset = "UTF-8"; byte[] first3Bytes = new byte[3]; try { boolean checked = false; BufferedInputStream bis = new BufferedInputStream( new FileInputStream(sourceFile)); bis.mark(0); int read = bis.read(first3Bytes, 0, 3); if (read == -1) { return charset; // 文件编码为 ANSI } else if (first3Bytes[0] == (byte) 0xFF && first3Bytes[1] == (byte) 0xFE) { charset = "UTF-16LE"; // 文件编码为 Unicode checked = true; } else if (first3Bytes[0] == (byte) 0xFE && first3Bytes[1] == (byte) 0xFF) { charset = "UTF-16BE"; // 文件编码为 Unicode big endian checked = true; } else if (first3Bytes[0] == 49 && first3Bytes[1] == -60 && first3Bytes[2] == -29) { charset = "gb2312"; // 文件编码为 ANSI checked = true; } else if (first3Bytes[0] == 49 && first3Bytes[1] == -95 && first3Bytes[2] == -94) { charset = "gb2312"; // 文件编码为 ANSI checked = true; } else if (first3Bytes[0] == -51 && first3Bytes[1] == -8 && first3Bytes[2] == -62) { charset = "gb2312"; // 文件编码为 ANSI checked = true; } bis.reset(); if (!checked) { int loc = 0; while ((read = bis.read()) != -1) { loc++; if (read >= 0xF0) break; if (0x80 <= read && read <= 0xBF) // 单独出现BF以下的,也算是GBK break; if (0xC0 <= read && read <= 0xDF) { read = bis.read(); if (0x80 <= read && read <= 0xBF) // 双字节 (0xC0 - 0xDF) // (0x80 // - 0xBF),也可能在GB编码内 continue; else break; } else if (0xE0 <= read && read <= 0xEF) {// 也有可能出错,但是几率较小 read = bis.read(); if (0x80 <= read && read <= 0xBF) { read = bis.read(); if (0x80 <= read && read <= 0xBF) { charset = "UTF-8"; break; } else break; } else break; } } } bis.close(); } catch (Exception e) { e.printStackTrace(); } return charset; }
修改版的java导入编码问题(方法)
猜你喜欢
转载自blog.csdn.net/u013183139/article/details/39007233
今日推荐
周排行