首頁 >Java >Java基礎 >java中byte[]轉String出現亂碼

java中byte[]轉String出現亂碼

王林
王林原創
2019-11-27 09:28:0010384瀏覽

java中byte[]轉String出現亂碼

首先常用的byte[]直接轉String很簡單:

public static void main(String[] args) {  
String str="我是中国人";  
byte[] arr=str.getBytes();  
System.out.println("打印:"+arr);
for(byte e : arr) {
System.out.print(e + " ");
}
String str2=new String(arr);  
System.out.println("\n打印2:"+str2);  
}

java相關影片推薦:java學習

例如上面這個,輸出的結果是:

打印:[B@15db9742
-50 -46 -54 -57 -42 -48 -71 -6 -56 -53 
打印2:我是中国人

看到這個就知道編碼了。 byte是一個位元組,漢字是兩個位元組。所以五個漢字要十個byte類型的數位儲存。然後數字變成漢字,這中間就是走了一個編碼規範的過程。

那麼java中是如何處理字元編碼的呢?

JAVA使用自己的String類,且String類別物件是不需要指定編碼表的!為什麼它會自己知道一堆數字各代表什麼字元呢?就是因為String裡的字元資訊是用UNICODE編碼存放的。而JAVA為了表示字元(注意是單一字元),也有char這個資料類型,而且他的大小是固定2個8位16進位數字長度,也就是0~65535。為的就是對應UNICODE裡面的一個字元。

大家如果想取一個String裡的按UNICODE數字,可以用getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 方法取得一個char[],這個char[]裡面就是表示String字元的,按UNICODE編碼表編碼的數字。

為什麼會出現byte[ ]轉String又會出現亂碼現象?

很顯然,就是上面提到的,編碼規範不一樣。舉個栗子,例如GB2312規範的中文「當」字,就是用0xB5,0xB1這兩個八位數的數字來表示的。在英文系統上,沒有GB2312編碼表,給他一個0xB5,0xB1,他就傻傻的當作ASCII來處理。放到Java裡,他又會依照自己的UNICODE規範來處理,所以規範不一樣,就會出現奇怪的結果,也就是亂碼。

那我們要怎麼解決byte[ ]轉String的亂碼問題呢?

得看byte[]來自哪裡了。常常會遇到,要把一張圖片轉為byte[]然後在轉為String流物件傳送到別的地方,接收者再轉為byte[]再變成圖片。

1、直接傳輸byte[]的話,會出現byte[]過長資料遺失。因為不是所有的byte組合都可以映射成char。

2、用常見的Base64編碼規範吧。 base64的編碼規範就是將常見的字元轉換成6位元二進位表示(常用64個所以叫base64吧)。怎麼寫,有現成的工具類別哦如下:

import org.apache.commons.codec.binary.Base64;  
public class UtilHelper {     
    //base64字符串转byte[]  
    public static byte[] base64String2ByteFun(String base64Str){  
        return Base64.decodeBase64(base64Str);  
    }  
    //byte[]转base64  
    public static String byte2Base64StringFun(byte[] b){  
        return Base64.encodeBase64String(b);  
    }  
}

這樣就可以保證byte[]和String之間的標準轉換了。

更多相關文章教學推薦:java零基礎入門

#

以上是java中byte[]轉String出現亂碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn