首先常用的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中文網其他相關文章!