以位元組流讀取檔案時中文亂碼解決(二)
阿新 • • 發佈:2018-12-31
在上一節中說明了每次讀取一個位元組時亂碼解決方法,這一節我將闡述每次讀取多個位元組亂碼的解決。
問題:
中文字元佔2個位元組,非中文佔一個位元組
例如:"abc中國"
當我們以每四個位元組讀取檔案時,此時會讀到 "abc" + "中"的一半,此時就會產生亂碼。
byte[] b = new btye[4];
inputStream.read(b);//出現亂碼
解決方法:
1.判斷當前讀到的 byte陣列是否亂碼,參考: http://www.cnblogs.com/Nbge/archive/2013/05/22/3093041.html
2.當前byte陣列存在亂碼時,必定是在讀取最後一個位元組時讀到了中文的一半,此時我們再讀取一個位元組,然後重新建立byte陣列,這樣就解決了亂碼。
原始碼:
public void test() { byte[] b = new byte[4]; int len = -1; try (InputStream is = new FileInputStream("files/test2.txt")) { while ((len = is.read(b)) != -1) { // String s = new String(new byte[] { b[len - 2], b[len - 1] }); String s = new String(b, 0, len); byte[] b2 = s.getBytes("iso8859_1"); // 以 iso8859_1 編碼時出現亂碼時 byte 值為 63 if (b2[b2.length - 1] == 63) { byte[] b3 = new byte[1]; is.read(b3); byte temp = b3[0]; b3 = Arrays.copyOf(b, b3.length + b.length); b3[b3.length - 1] = temp; System.out.print(new String(b3, 0, b3.length)); } else { System.out.print(new String(b, 0, len)); } } } catch (Exception e) { e.printStackTrace(); } }