IO流系列---【字節流讀取中文亂碼的問題】


1.問題

  例如:文件中有"張三a好好學習"內容,使用字節流讀取的時候,UTF-8漢字占3個字(例:[-32,-43,-32]),而字母“a”(例:[97])占一個字節,使用編輯器打開查看的時候,因為97和后面漢字"好"([-32,-54,-12])的前兩個字節拼在了一起,導致亂碼,字節流無法保證,每次讀取到的是一個字符/多個字符對應的完整的字節內容,容易出現亂碼。

2.解決方案

  使用字符流讀取,可以 保證每次讀取到的是一個字符/多個字符對應的完整的字節內容,詳見字符流讀取文件。

3.示例代碼

/*
    字節流讀取中文的問題?
    字節流無法保證,每次讀取到的是一個字符/多個字符對應的完整的字節內容,容易出現亂碼
    解決方案:
        字符流: 保證每次讀取到的是一個字符/多個字符對應的完整的字節內容

    中文windows操作系統,默認編碼表: GBK
    GBK: 一個漢字占2個字節
    IDEA默認編碼表: UTF-8
    UTF-8: 一個漢字占3個字節

    如何獲取String對應的字節數組?
    String類的成員方法
    public byte[] getBytes(): 根據平台默認編碼表(IDEA默認編碼表: UTF-8),獲取String的字節數組

    你好    的UTF-8編碼: [-28, -67, -96, -27, -91, -67]

    你好a   的UTF-8編碼: [-28, -67, -96, -27, -91, -67, 97 .....
 */
public class Demo02InputStreamProblems {
    public static void main(String[] args) throws IOException {
        byte[] bs1 = "你好".getBytes();//字符串"你好"的UTF-8編碼
        //System.out.println("你好    的UTF-8編碼: "+ Arrays.toString(bs1));


        FileInputStream fis = new FileInputStream("day11\\02_代碼\\day11\\src\\fis3.txt");//你好a哈哈哈
        /*int b = 0;
        while((b = fis.read())!=-1) {
            System.out.println((char)b);
        }*/
        int len = 0;
        byte[] bs = new byte[3];
        while((len = fis.read(bs))!=-1) {
            System.out.print(new String(bs,0,len));//你好#¥#%……#
        }
        fis.close();
    }
}

 


免責聲明!

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



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