最近的項目中要使用到把byte[]類型轉換成String字符串然後通過網絡發送,但發現發現出去的字符串和獲取的字符串雖然是一樣的,但當用String的getBytes()的方法得到的byte[]跟原來的byte[]是不一樣的。
看如下代碼:
bytebytes[] = new byte[] { 50, 0, -1, 28, -24 };
String string = new String(bytes);
byte[] ret = string.getBytes();
查看ret的數據發現是50, 0, -17, -65, -67, 28, -17, -65, -67,發現數據並不是原來的數據。
而使用如下代碼就可以得到原來的數據:
bytebytes[] = new byte[] { 50, 0, -1, 28, -24 };
StringisoString = new String(bytes, "ISO-8859-1");
byte[] isoret = isoString.getBytes("ISO-8859-1");
這是爲什麼呢?原因是第一種方法默認是用UTF-8編碼來生成String的,用System.getProperty("sun.jnu.encoding")可以得到Android默認編碼是UTF-8。UTF-8是可變長度的編碼,原來的字節數組就被改變了。而ISO8859-1通常叫做Latin-1,Latin-1包括了書寫所有西方歐洲語言不可缺少的附加字符,其中 0~127的字符與ASCII碼相同,它是單字節的編碼方式,這樣第二種方式生成的String裏的字節數組就跟原來的字節數組一樣。在new String使用其他編碼如GBK,GB2312的話一樣也會導致字節數組發生變化,因此要想獲取String裏單字節數組,就應該使用iso8859-1編碼。