如何解決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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM