十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
怎么解決java中byte[]轉(zhuǎn)成String的亂碼問(wèn)題?針對(duì)這個(gè)問(wèn)題,今天小編總結(jié)了這篇文章,希望能幫助更多想解決這個(gè)問(wèn)題的朋友找到更加簡(jiǎn)單易行的辦法。
首先常用的byte[]直接轉(zhuǎn)String很簡(jiǎn)單:
public static void main(String[] args) { String str="我是中國(guó)人"; 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); }
比如上面這個(gè),輸出的結(jié)果是:
打?。篬B@15db9742 -50 -46 -54 -57 -42 -48 -71 -6 -56 -53 打印2:我是中國(guó)人
看到這個(gè)就知道編碼了。byte是一個(gè)字節(jié),漢字是兩個(gè)字節(jié)。所以五個(gè)漢字要十個(gè)byte類型的數(shù)字存儲(chǔ)。然后數(shù)字變成漢字,這中間就是走了一個(gè)編碼規(guī)范的過(guò)程。
java中是如何處理字符編碼的?
JAVA使用自己的String類,并且String類對(duì)象是不需要指定編碼表的!為什么它會(huì)自己知道一堆數(shù)字各代表什么字符呢?就是因?yàn)镾tring里的字符信息是用UNICODE編碼存放的。而JAVA為了表示字符(注意是單個(gè)字符),也有char這個(gè)數(shù)據(jù)類型,而且他的大小是固定2個(gè)8位16進(jìn)制數(shù)字長(zhǎng)度,也就是0~65535。為的就是對(duì)應(yīng)UNICODE里面的一個(gè)字符。
大家如果想取一個(gè)String里的按UNICODE數(shù)字,可以用getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
方法取得一個(gè)char[],這個(gè)char[]里就是表示String字符的,按UNICODE編碼表編碼的數(shù)字。
為什么byte[ ]轉(zhuǎn)String會(huì)出現(xiàn)亂碼現(xiàn)象?
很顯然,就是上面提到的,編碼規(guī)范不一樣。舉個(gè)栗子,比如GB2312規(guī)范的中文“當(dāng)”字,就是用0xB5,0xB1這兩個(gè)八位的數(shù)字來(lái)表示的。在英文系統(tǒng)上,沒(méi)有GB2312編碼表,給他一個(gè)0xB5,0xB1,他就傻傻的當(dāng)作ASCII來(lái)處理。放到Java里,他又會(huì)按照自己的UNICODE規(guī)范來(lái)處理,所以規(guī)范不一樣,就會(huì)出現(xiàn)奇怪的結(jié)果,也就是亂碼。
怎么解決byte[ ]轉(zhuǎn)String的亂碼問(wèn)題呢?
得看byte[]來(lái)自哪里了。時(shí)常會(huì)遇到,要把一張圖片轉(zhuǎn)為byte[]然后在轉(zhuǎn)為String流對(duì)象傳輸?shù)絼e的地方,接收者再轉(zhuǎn)為byte[]再變成圖片。
1、直接傳輸byte[]的話,會(huì)出現(xiàn)byte[]過(guò)長(zhǎng)數(shù)據(jù)丟失。因?yàn)椴皇撬械腷yte組合都可以映射成char。
2、用常見(jiàn)的Base64編碼規(guī)范吧。base64的編碼規(guī)范就是將常見(jiàn)的字符轉(zhuǎn)換成6位二進(jìn)制表示(常用64個(gè)所以叫base64吧)。怎么寫(xiě),有現(xiàn)成的工具類哦如下:
import org.apache.commons.codec.binary.Base64; public class UtilHelper { //base64字符串轉(zhuǎn)byte[] public static byte[] base64String2ByteFun(String base64Str){ return Base64.decodeBase64(base64Str); } //byte[]轉(zhuǎn)base64 public static String byte2Base64StringFun(byte[] b){ return Base64.encodeBase64String(b); } }
這樣就可以保證byte[]和String之間的標(biāo)準(zhǔn)轉(zhuǎn)換了。
關(guān)于解決java中byte[]轉(zhuǎn)成String亂碼問(wèn)題的方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。