1. 程式人生 > >計算機是如何識別什麼時候該把兩個位元組轉換成為一箇中文呢

計算機是如何識別什麼時候該把兩個位元組轉換成為一箇中文呢

package cn.itcast_02;

import java.io.FileInputStream;
import java.io.IOException;

/*
 * 位元組輸入流操作步驟:
 * A:建立位元組輸入流物件
 * B:呼叫read()方法讀取資料,並把資料顯示在控制檯
 * C:釋放資源
 * 
 * 讀取資料的方式:
 * A:int read():一次讀取一個位元組
 * B:int read(byte[] b):一次讀取一個位元組陣列
 */
public class FileInputStreamDemo {
	public static void main(String[] args) throws IOException {
		
		FileInputStream fis = new FileInputStream("FileOutputStreamDemo.java");


		int by = 0;
		// 讀取,賦值,判斷
		while ((by = fis.read()) != -1) {
			System.out.print((char) by);
		}

		// 釋放資源
		fis.close();
	}
}

 上面的程式碼讀取英文,數字等都沒問題,唯獨中文出現了問題.

原因在於,每次讀取到一個位元組就通過 (char)by 強制轉換成一個字元,而  中文=1個字元=兩個位元組  ,相當於一個中文讀取到一半就被轉換了,所以中文讀取出錯

 

package cn.itcast_03;

import java.util.Arrays;

/*
 * 計算機是如何識別什麼時候該把兩個位元組轉換為一箇中文呢?
 * 在計算機中中文的儲存分兩個位元組:
 * 		第一個位元組肯定是負數。
 * 		第二個位元組常見的是負數,可能有正數。但是沒影響。
 */
public class StringDemo {
	public static void main(String[] args) {
		// String s = "abcde";
		// // [97, 98, 99, 100, 101]

		String s = "我愛你中國";
		// [-50, -46, -80, -82, -60, -29, -42, -48, -71, -6]

		byte[] bys = s.getBytes();
		System.out.println(Arrays.toString(bys));
	}
}

從上面的例子看到,java通過左邊負數的整形,得知要與右邊的整形相加.得到一箇中文