Android中文亂碼徹底解決
以下是我研究的成果,希望對您有幫助:
sb = new StringBuffer(); HttpEntity entity = response.getEntity(); InputStream is = entity.getContent(); BufferedReader br = new BufferedReader( new InputStreamReader(is,"GB2312")); String data = ""; while ((data = br.readLine()) != null) { sb.append(data); } String result = sb.toString();
//下面的是多余的代碼,平臺會按照默認編碼讀數據,謝謝melode11和eleda指點 result = new String(result.getBytes(),"UTF-8"); 我解釋一下,
BufferedReader br = new BufferedReader( new InputStreamReader(is,"GB2312"));
|
|
評論
如果源真的是GB2312,那么InputStreamReader讀入的已經是正確的值了。
如果想要把result按utf-8編碼存到某文件, 那么 result.getBytes("utf-8")得到字節(jié)數組,再寫入 outputStream才是對的。
厄,如果對字符編碼沒概念的話,解釋起來很麻煩。
result.getBytes() 是 new String(byte[]) 的逆過程。
前面那個是 String->byte[] ,后面那個是 byte[] -> String.
在java運行時的時候,String與String是沒有區(qū)別的都是以2字節(jié)的unicode的形式存在內存中,所謂編碼,是針對把String轉換成 byte[]而言的。比如我可以把 "abc" 通過 utf-8轉換成了一串數據 A ,也可以通過gb2312轉換成另一串數據 B,這個過程就是 String.getBytes(),比如 "abc".getBytes("utf-8")得到A , "abc".getBytes("gb2312")得到B。如果是"abc".getBytes(),就不知道用的什么編碼了,這和平臺相關。
那如何從A串或者 B串重新得到String呢,那就是 new String(A,"utf-8") 或者 new String(B,"gb2312")。因為A是從utf-8轉換得到的,所以用utf-8轉回String ,如果new String(A,"gb2312"), 那么其中的中文就是亂碼。
當然gbk和utf-8的有小部分編碼集合是一樣的,所以英文字符,一般不管怎么轉都可以歪打正著。
另外,因為網絡傳輸肯定是用byte[]的,不可能直接把String對象給傳過來,所以server想把某個字符串傳給client之前,需要將他轉成byte[] , 這中間就用了server指定的一種編碼,client在收到這個 byte[]之后,就必須要采用和server相同的編碼,把byte[]重新轉換為String。這就是InputStreamReader需要指定一個編碼的原因。
InputStreamReader作用就是在通過inputStream讀到byte[]的同時,將byte[]用指定的編碼,轉換為 char[],也就是實際上的String.
說了一大堆,不知道這表達的你能不能明白
我明白您的意思了
這句話確實是多余的,按照您的意思client已經按照默認編碼進行轉換了。再次感謝melode11以后請多多關照。
如果源真的是GB2312,那么InputStreamReader讀入的已經是正確的值了。
如果想要把result按utf-8編碼存到某文件, 那么 result.getBytes("utf-8")得到字節(jié)數組,再寫入 outputStream才是對的。
厄,如果對字符編碼沒概念的話,解釋起來很麻煩。
result.getBytes() 是 new String(byte[]) 的逆過程。
前面那個是 String->byte[] ,后面那個是 byte[] -> String.
在java運行時的時候,String與String是沒有區(qū)別的都是以2字節(jié)的unicode的形式存在內存中,所謂編碼,是針對把String轉換成 byte[]而言的。比如我可以把 "abc" 通過 utf-8轉換成了一串數據 A ,也可以通過gb2312轉換成另一串數據 B,這個過程就是 String.getBytes(),比如 "abc".getBytes("utf-8")得到A , "abc".getBytes("gb2312")得到B。如果是"abc".getBytes(),就不知道用的什么編碼了,這和平臺相關。
那如何從A串或者 B串重新得到String呢,那就是 new String(A,"utf-8") 或者 new String(B,"gb2312")。因為A是從utf-8轉換得到的,所以用utf-8轉回String ,如果new String(A,"gb2312"), 那么其中的中文就是亂碼。
當然gbk和utf-8的有小部分編碼集合是一樣的,所以英文字符,一般不管怎么轉都可以歪打正著。
另外,因為網絡傳輸肯定是用byte[]的,不可能直接把String對象給傳過來,所以server想把某個字符串傳給client之前,需要將他轉成byte[] , 這中間就用了server指定的一種編碼,client在收到這個 byte[]之后,就必須要采用和server相同的編碼,把byte[]重新轉換為String。這就是InputStreamReader需要指定一個編碼的原因。
InputStreamReader作用就是在通過inputStream讀到byte[]的同時,將byte[]用指定的編碼,轉換為 char[],也就是實際上的String.
說了一大堆,不知道這表達的你能不能明白
如果源真的是GB2312,那么InputStreamReader讀入的已經是正確的值了。
如果想要把result按utf-8編碼存到某文件, 那么 result.getBytes("utf-8")得到字節(jié)數組,再寫入 outputStream才是對的。
厄,如果對字符編碼沒概念的話,解釋起來很麻煩。
result.getBytes() 是 new String(byte[]) 的逆過程。
前面那個是 String->byte[] ,后面那個是 byte[] -> String.
在java運行時的時候,String與String是沒有區(qū)別的都是以2字節(jié)的unicode的形式存在內存中,所謂編碼,是針對把String轉換成 byte[]而言的。比如我可以把 "abc" 通過 utf-8轉換成了一串數據 A ,也可以通過gb2312轉換成另一串數據 B,這個過程就是 String.getBytes(),比如 "abc".getBytes("utf-8")得到A , "abc".getBytes("gb2312")得到B。如果是"abc".getBytes(),就不知道用的什么編碼了,這和平臺相關。
那如何從A串或者 B串重新得到String呢,那就是 new String(A,"utf-8") 或者 new String(B,"gb2312")。因為A是從utf-8轉換得到的,所以用utf-8轉回String ,如果new String(A,"gb2312"), 那么其中的中文就是亂碼。
當然gbk和utf-8的有小部分編碼集合是一樣的,所以英文字符,一般不管怎么轉都可以歪打正著。
如果源真的是GB2312,那么InputStreamReader讀入的已經是正確的值了。
如果想要把result按utf-8編碼存到某文件, 那么 result.getBytes("utf-8")得到字節(jié)數組,再寫入 outputStream才是對的。
嗯,這段的確有問題!
如果系統(tǒng)的默認編碼是utf-8還好。
如果不是的話,result = new String(result.getBytes(),"UTF-8"); 這句就是亂碼的源泉!
您說的對,我是把GB2312轉換成UTF-8的,要不也不會出現亂碼,可能是我表達不清
如果源真的是GB2312,那么InputStreamReader讀入的已經是正確的值了。
如果想要把result按utf-8編碼存到某文件, 那么 result.getBytes("utf-8")得到字節(jié)數組,再寫入 outputStream才是對的。
如果源真的是GB2312,那么InputStreamReader讀入的已經是正確的值了。
如果想要把result按utf-8編碼存到某文件, 那么 result.getBytes("utf-8")得到字節(jié)數組,再寫入 outputStream才是對的。
嗯,這段的確有問題!
如果系統(tǒng)的默認編碼是utf-8還好。
如果不是的話,result = new String(result.getBytes(),"UTF-8"); 這句就是亂碼的源泉!
如果源真的是GB2312,那么InputStreamReader讀入的已經是正確的值了。
如果想要把result按utf-8編碼存到某文件, 那么 result.getBytes("utf-8")得到字節(jié)數組,再寫入 outputStream才是對的。
不敢當,也許會有更好的辦法呢