您好,登錄后才能下訂單哦!
怎么解決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); }
比如上面這個,輸出的結果是:
打印:[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中byte[]轉成String亂碼問題的方法就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。