IO流中位元組碼編碼的問題(亂碼原因分析)

2021-07-30 17:39:55 字數 1120 閱讀 1730

先列幾個概念:

1.各種位元組io流(bytearrayoutputstream,fileoutputstream)都是繼承的inputstream,和outputstream。

2.記憶體中執行的各種物件的位元組編碼格式都是unicode

3.我們將字串(string)轉為位元組陣列(byte),或者將位元組陣列轉化為字串的時候,可以指定編碼格式,常見的編碼格式有utf-8,gbk,unicode,iso-8859等。

舉例:

string str ="";

str.getbytes("utf-8")

byte buffer =newbyte[256];

bytearrayoutputstream out=newbytearrayoutputstream();

out.write(buffer,0, n)

out.tostring("gbk")

第一段**我們將字串編碼格式為utf-8的位元組陣列。

第二段**我們將位元組陣列寫入位元組流輸出物件中,並使用tostring轉化為字串,這個時候的轉換我們使用了gbk格式編碼。

如果我們不指定編碼格式,則jvm會使用系統預設的編碼格式進行編碼和解碼(android studio,eclipse等預設gbk、或者utf-8,可以修改配置成需要的編碼格式)。

我們知道,漢字在utf-8中是編碼為3個位元組的,而在gbk中是編碼成兩個位元組的。

如果編碼的時候,使用的utf-8,解碼使用gbk,就會出現亂碼。

舉個例子

字串 "廣州",被編碼成utf-8格式的話是6個位元組

e5 b9 bf e5 b7 9e

前三個位元組表示"廣",後三個位元組表示"州"

如果這個位元組陣列被gbk格式解碼後,就會每兩個位元組對應乙個漢字

e5 b9 --> 騫

bf e5-->  垮

b7 9e-->  窞

"廣州" 就變成了亂碼 "騫垮窞"

解決方法:

所以,我們在字串的編碼解碼過程中(主要是io通訊時候),最好是主動指定編碼的格式,設定成同意的格式,不然的話,如果編碼所在機器和解碼伺服器的預設編碼格式不一樣的話,就很容易出現亂碼。

IO流中資料傳遞的位元組流和字元流

第三種 與第二種基本一致,但資料用 byte陣列儲存 file file new file practice1.txt filereader fr null bufferedreader br null try catch filenotfoundexception e catch ioexcept...

File類中的常用方法 IO流中的位元組流

1.file類 檔案和目錄路徑名的抽象表示 2.絕對路徑 帶碟符的路徑.相對路徑 相對其他檔案或目錄的乙個路徑叫相對路徑.如果當前檔案或目錄相對其他碟符的的檔案或目錄來說,此時相對路徑 絕對路徑.如果當前檔案或目錄相對當前所有在的碟符的檔案或目錄來說,此時相對路徑 絕對路徑.根路徑 相當當前專案的路...

字元流中的編碼解碼問題

構造方法 方法名說明 inputstreamreader inputstream in 使用預設字元編碼建立inputstreamreader物件 inputstreamreader inputstream in,string chatset 使用指定的字元編碼建立inputstreamreader...