byte[]轉(zhuǎn)String亂碼、數(shù)據(jù)不一致

本來,我想將byte[]數(shù)組在feign中傳輸,因?yàn)榉庋b的返回對象中沒有數(shù)組類型的返回值,且是同事的代碼,傳輸byte[]并不常用,就不想改同事封裝的對象。我就想著將byte[]數(shù)組轉(zhuǎn)成String,再將String轉(zhuǎn)成byte[]數(shù)組應(yīng)該行得通??墒聦?shí)卻打臉了,拿到的byte[]數(shù)組和原來的byte[]數(shù)組的地址不一致,這是因?yàn)閬y碼導(dǎo)致;在轉(zhuǎn)換過程中加上"ISO-8859-1"字符編碼可以解決亂碼問題。

先看兩個例子。
1.示例一:String裝byte[],再將byte[]數(shù)組轉(zhuǎn)成String

        String string = "String case to byte[]";
        byte[] bytes = string.getBytes();
        String newString = new String(bytes);

輸出的結(jié)果顯示string、newString字符串的值是一致的,轉(zhuǎn)換正確。

2.示例二:byte[]數(shù)組轉(zhuǎn)String,再將String轉(zhuǎn)成byte[]

        byte[] bytes = {-28, -72, -83, -27, -101, -67};
        String string = new String(bytes);
        byte[] newBytes = string.getBytes();

輸出的byte[]字節(jié)數(shù)組的值為 {-28, -72, -83, -27, -101, -67}、newByte[]字節(jié)數(shù)組的值都為 {-28, -17, -65, -67, 2, -47},轉(zhuǎn)換錯誤。

使用"ISO-8859-1"編碼

        byte[] bytes = {-28, -72, -83, -27, -101, -67};
        String string = new String(bytes, "ISO-8859-1");
        byte[] newBytes = string.getBytes("ISO-8859-1");

輸出的byte[]字節(jié)數(shù)組、newByte[]字節(jié)數(shù)組的值都為 {-28, -72, -83, -27, -101, -67}, 轉(zhuǎn)換正確
3.結(jié)論:
分析兩個示例,String能夠互轉(zhuǎn)和byte[]不能夠互轉(zhuǎn)的原因,因?yàn)榫幋a的原因?qū)е罗D(zhuǎn)換亂碼或者錯誤。在兩個示例中我都沒有顯示的指定轉(zhuǎn)換數(shù)據(jù)的編碼,其實(shí)內(nèi)部默認(rèn)指定的編碼規(guī)則是"UTF-8"。因?yàn)?UTF-8"是可變長編碼,在String轉(zhuǎn)byte[]再將byte[]轉(zhuǎn)String的時候String字符串的大小是確定,String字符串不會改變長度。byte[]轉(zhuǎn)String,再將String轉(zhuǎn)byte[]的時候,String字符串會變長,再轉(zhuǎn)回原來的byte[]數(shù)組就發(fā)生錯誤了。在java中"ISO-8859-1"編碼可以解決轉(zhuǎn)碼錯誤的問題,ISO-8859-1通常叫做Latin-1,Latin-1包括了書寫所有西方歐洲語言不可缺少的附加字符,其中 0~127的字符與ASCII碼相同,它是單字節(jié)的編碼方式,這樣第二種示例生成的String里的字節(jié)數(shù)組就跟原來的字節(jié)數(shù)組一樣。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容