天天看點

java字元串編碼問題

 首先unicode是字元集,儲存着字元與16進制數的對應,每個字元都對應這一個編号也就是兩個位元組的16進制數。而utf-8,gbk這些稱為編碼方式,其将十六進制數根據具體的算法轉化為2進制儲存在記憶體中,一個字元儲存在記憶體中的值不一定是編号。java采用unicode編碼儲存所有字元,其實就是每個字元在記憶體中都使用兩個位元組存儲編号,不做轉換。

(1)從os檔案系統中讀取檔案的過程:檔案是以指定編碼儲存在系統中,其位元組到字元的映射就是編碼完成的工作。首先,讀取二進制流,以指定編碼的方式轉化為unicode編碼也就是編号,放入記憶體。讀取完畢,如果指定編碼錯誤,同樣的二進制流編碼體系中沒有對應的字元,就以預設字元填充,也就是??之類的。這就是讀取亂碼的根源。

(2)從java寫入os檔案系統的過程:将unicode方式儲存的16進制編号按照指定編碼規範映射為該編碼對應的位元組流寫入檔案。