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