本來,我想將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ù)組一樣。