zoukankan      html  css  js  c++  java
  • 如何解决GBK的编码的文件中的中文转换成为UTF-8编码的文件而且不乱码

    首先我们必须明确一点,为什么正常转换会乱码?

    因为我们的数据写入是GBK写入的,然后展示的话是按照文件保存形势展示的,前面保存形势是GBK,一致,所以不乱码,而后面将保存形势变成了UTF-8,但是写入的内容是GBK形势的,编码解码方式不一致,所以产生乱码。

    我们一般的解决乱码的思路是:

    String s=new String(str.getBytes("GBK"),"UTF-8");

    我将它解决的思路也是这样子的:

    首先我们知道引起乱码的只是因为中文,中文乱码的方式看起来就是上面那样解决的。

    将文件的编码改变,而且里面的内容的编写编码也随之改变,很显然不是单纯地对文件进行格式改变,改变格式的同时必定要改变文件的内容。

    我的初步想法:

    将文件内容读取到流中,然后按指定编码写入到目标文件中。

    过程:

    将目标文件取读到流中

    读取源文件中的信息用字符串的形式展示,

    将字符串写入目标文件

    注意问题:

    1、读取目标文件默认读取编码是当前项目编码而不是源文件编码,我们可以使用FileInputStream的含有编码方式的构造达到我们的要求

    2、取读每一行字符串后的写入其实是不需要转换字符串格式的。就像我就犯了一个错误,我前面将读取成功的字符串通过new String(getBytes("GBK"),"UTF-8");的形式再次写入文件中,导致一直乱码,忽略了一个问题,就是我读取文件的时候其实已经解码了,此时字符串的编码方式应该就是我的项目编码方式了。

    3、读取完一行数据记得的换行

    其他的问题就是:

    将文件夹中的所有指定文件都进行编码格式的改变,一个递归调用指定方法的过程罢了!

    代码实现:

    import org.apache.commons.io.IOUtils;
    
    import java.io.*;
    import java.util.ArrayList;
    
    /**
     * Created by Administrator on 2016/12/1.
     */
    public class Test {
        String ROUTE_URL="D:/test";
        String srcEncode;
        ArrayList<File> fileArray=new ArrayList<File>();
    
        public void  trans(String filePath) throws Exception{
            getFileClass(new File(filePath));
            for (File file:fileArray){
                transEncode(file.getAbsolutePath());
            }
        }
    
        /**
         * 将文件由GBK格式读取,UTF-8格式写入
         * 运行的项目应该是UTF-8的项目
         * filePath用相对路径方便转移。如果使用绝对路径自己改一下输出流的url
         */
        public void  transEncode(String filePath) throws Exception{
            File target=new File(ROUTE_URL,filePath);
            FileInputStream fis=new FileInputStream(filePath);
            BufferedReader br=new BufferedReader(new InputStreamReader(fis,srcEncode));
            FileOutputStream fos=new FileOutputStream(target);
            IOUtils.copy(br,fos);
            fos.flush();
            fis.close();
            fos.close();
        }
    
        /*
         * 递归遍历指定目录下的指定后缀文件
         */
            /*
             * 返回值类型 void
             * 参数列表  文件夹File
             * 出口条件:文件,后缀名是.class,如果排除的话加!即可.多个可使用全局变量
             *
             */
            public void getFileClass(File file){
                File[] files=file.listFiles();
                for(File f:files){
                    if(f.isDirectory()){
                        getFileClass(f);
                    }else{
                        if(f.getName().endsWith(".java") || f.getName().endsWith(".jsp")){
                            System.out.println(f.getAbsolutePath());
                            fileArray.add(f);
                        }
                    }
                }
            }
        }
    View Code
  • 相关阅读:
    layer备忘
    Java中遍历Map对象的4种方法
    为什么Java中1000==1000为false而100==100为true?
    linux系统安装psycopg2
    centos7源码安装mysql5.7
    Azure Sql
    javascript和jQuery动态修改css样式的方法
    Git early EOF index-pack failed 问题
    C# 多线程——SemaphoreSlim的使用
    Docker 可视化
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/6049458.html
Copyright © 2011-2022 走看看