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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

Java是熱門程式語言,適合初學者和經驗豐富的開發者學習。本教學從基礎概念出發,逐步深入解說進階主題。安裝Java開發工具包後,可透過建立簡單的「Hello,World!」程式來實踐程式設計。理解程式碼後,使用命令提示字元編譯並執行程序,控制台上將輸出「Hello,World!」。學習Java開啟了程式設計之旅,隨著掌握程度加深,可創建更複雜的應用程式。
