开心一笑: 这路太滑了吧...

    关注微信公众号

    QQ群:831045818

    app下载

    当前位置:首页>技术文档 > java > 正文
    读不同编码txt 解决乱码问题
    发布时间: 2020-06-29 浏览次数:
    public String editFile() {
        DataInfo out = new DataInfo();
        File file= new File("C://iauto//svn_project//test_windows_test2//cs.txt");
        //编码处理
        String encoding=getFilecharset(file);
        System.out.println("system:"+encoding);
    
        StringBuilder result = new StringBuilder();
        try{
            InputStreamReader read = new InputStreamReader (new FileInputStream(file),encoding);
            BufferedReader br = new BufferedReader(read);
            String s = null;
            while((s = br.readLine())!=null){//使用readLine方法,一次读一行
                result.append(System.lineSeparator()+s);
            }
            br.close();
        }catch(Exception e){
            e.printStackTrace();
        }
        
        //result.toString();
        return result.toString();
    }
    
    //编码处理
    //判断编码格式方法
    public static String getFilecharset(File sourceFile) {
        String charset = "GBK";
        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] == (byte) 0xEF
                    && first3Bytes[1] == (byte) 0xBB
                    && first3Bytes[2] == (byte) 0xBF) {
                charset = "UTF-8"; //文件编码为 UTF-8
                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;
    }


    关注"都市百货" 了解南陵

    管理员微信

    点赞
    0
    上一篇:jpa 一对多 下一篇:java zip批量压缩

    评论已有 0

    南陵新闻
    公示公告
    常用查询
    风光南陵
    走出南陵
    友情链接