Java文件讀取 中文亂碼


1 字節流以及編碼轉換說明

String str = "";

byte[] b_gbk =str.getBytes("GBK");

byte[] b_utf8 =str.getBytes("UTF-8");

String s_gbk = newString(b_gbk,"GBK");

String s_utf8 = newString(b_utf8,"UTF-8");

System.out.println(s_gbk);

System.out.println(s_utf8);

 

環境:Windows系統Eclipse,源碼格式是GBK,爲什麼寫明環境,主要還是跟系統顯示有關

 

1.1詳細剖析

第一行代碼其實暗含:str是一個GBK編碼的字符串,裏面的byte數組存儲的編碼字符串是GBK編碼的。


第二行代碼getBytes是什麼意思呢?就是告訴系統,你把str裏面的字符串內容,轉換成GBK編碼然後存儲到b_gbk,這就會涉及到GBK編碼轉換成UTF-8編碼,如果理解不了,可以這樣子想:中字在GBK裏面的編碼是這樣子這樣子,你看看中字在UTF-8的編碼是什麼,告訴我。


第四行代碼後面有指定編碼格式,就是告訴系統,我這個String類型存儲的是GBK編碼的字符串,系統在顯示該字符串的時候,知道其編碼格式,採用GBK來解碼顯示。

 

問題1

java讀取utf-8編碼文件,出現中文亂碼,最大可能的原因是什麼?讀取GBK編碼文件,是正常的!

     上面已經提到過String變量是有編碼的格式要求的,默認情況下,讀取文件的時候會根據系統的默認編碼來讀取,這種情況下,肯定就是亂碼了,因爲讀取進去的就是,賦值給String就是GBK編碼。

 

問題2

utf-8BOM的文件會出現?這個符號,這是什麼情況?

    原來BOM在文件中也是一種字符存在,因爲沒有對應的編碼輸出,所以只能夠顯示這種符號了。所以在應用中不要選擇這種編碼方式就可以了。

 

2 UTF-8或者GBK文本的讀取

有了上面的基礎,就可以讀取文本了。構建一個UTF-8的中文文檔

    public static void method()

    {

        try {

            File  file = new File("d:fengyuzaitu.txt");

            byte buffer[] = newbyte[20];

            FileInputStreamf ileinput = new FileInputStream(file);

            fileinput.read(buffer);

            Strings = new String(buffer, "UTF-8");    

            System.out.println(s);

            fileinput.close();         

        }catch(IOException e) {

            e.printStackTrace();

        }

    }

   

    public static void method1()

    {

        try {

            FileInputStream fileinput = new FileInputStream("d:fengyuzaitu.txt");

            InputStreamReader isr = new InputStreamReader(fileinput, "UTF-8");

            BufferedReader br = new BufferedReader(isr);

            Stringtest = "";

            test = br.readLine();

            System.out.println(test);  

            br.close();

        }catch(IOException e) {

            e.printStackTrace();

        }

    }

 

這裏進行詳細描述:

方法1:直接讀取字節流,然後指定String的編碼類型,也就是字節流當前的編碼類型

方法2:指定讀取文本採用的編碼格式,返回的String實際上就是經過第一種方法的包裝之後返回的。

 

溫馨提示:讀取sqlite數據庫的時候,如果將GBK字節流存儲進去,讀取出來的時候採用getBytes,讀取字節流,然後按照上面的方法進行轉換。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章