1. 程式人生 > >以位元組流讀取檔案時中文亂碼解決(二)

以位元組流讀取檔案時中文亂碼解決(二)

在上一節中說明了每次讀取一個位元組時亂碼解決方法,這一節我將闡述每次讀取多個位元組亂碼的解決。

問題:

中文字元佔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();
		}
	}