日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Android中文亂碼徹底解決

 w_hf的圖書館 2011-08-03
Android中文亂碼徹底解決

以下是我研究的成果,希望對您有幫助:

Java代碼 復制代碼 收藏代碼
  1. sb = new StringBuffer();
  2. HttpEntity entity = response.getEntity();
  3. InputStream is = entity.getContent();
  4. BufferedReader br = new BufferedReader(
  5. new InputStreamReader(is,"GB2312"));
  6. String data = "";
  7. while ((data = br.readLine()) != null) {
  8. sb.append(data);
  9. }
  10. String result = sb.toString();
Java代碼 復制代碼 收藏代碼
  1. //下面的是多余的代碼,平臺會按照默認編碼讀數據,謝謝melode11和eleda指點 result = new String(result.getBytes(),"UTF-8");

我解釋一下,

Java代碼 復制代碼 收藏代碼
  1. BufferedReader br = new BufferedReader(
  2. new InputStreamReader(is,"GB2312"));


是讀取要改編碼的源,源的格式是GB2312的,安源格式讀進來,然后再對源碼轉換成想要的編碼就行

分享到:
評論
12 樓 vvvpig 2010-09-18 引用
還是萬惡的java編碼問題啊
11 樓 zjjgogogo 2010-09-07 引用
樓主,感謝??!
10 樓 bashenmail 2009-11-23 引用
melode11 寫道
melode11 寫道
bashenmail 寫道
melode11 寫道
result = new String(result.getBytes(),"UTF-8"); 這句莫名其妙的。
如果源真的是GB2312,那么InputStreamReader讀入的已經是正確的值了。
如果想要把result按utf-8編碼存到某文件, 那么 result.getBytes("utf-8")得到字節(jié)數組,再寫入 outputStream才是對的。

Java代碼 復制代碼 收藏代碼
  1. result = new String(result.getBytes(),"UTF-8"); 和result.getBytes("utf-8")
有什么不同嗎?還請您賜教

厄,如果對字符編碼沒概念的話,解釋起來很麻煩。
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.
說了一大堆,不知道這表達的你能不能明白



我明白您的意思了
Java代碼 復制代碼 收藏代碼
  1. result = new String(result.getBytes(),"UTF-8");
這段代碼是確實有問題,我在調試的時候也感覺到了這個問題,就是沒弄明白其中機制。非常感謝melode11詳細講解,向您致敬!高手!
這句話確實是多余的,按照您的意思client已經按照默認編碼進行轉換了。再次感謝melode11以后請多多關照。
9 樓 melode11 2009-11-22 引用
melode11 寫道
bashenmail 寫道
melode11 寫道
result = new String(result.getBytes(),"UTF-8"); 這句莫名其妙的。
如果源真的是GB2312,那么InputStreamReader讀入的已經是正確的值了。
如果想要把result按utf-8編碼存到某文件, 那么 result.getBytes("utf-8")得到字節(jié)數組,再寫入 outputStream才是對的。

Java代碼 復制代碼 收藏代碼
  1. result = new String(result.getBytes(),"UTF-8"); 和result.getBytes("utf-8")
有什么不同嗎?還請您賜教

厄,如果對字符編碼沒概念的話,解釋起來很麻煩。
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.
說了一大堆,不知道這表達的你能不能明白
8 樓 melode11 2009-11-22 引用
bashenmail 寫道
melode11 寫道
result = new String(result.getBytes(),"UTF-8"); 這句莫名其妙的。
如果源真的是GB2312,那么InputStreamReader讀入的已經是正確的值了。
如果想要把result按utf-8編碼存到某文件, 那么 result.getBytes("utf-8")得到字節(jié)數組,再寫入 outputStream才是對的。

Java代碼 復制代碼 收藏代碼
  1. result = new String(result.getBytes(),"UTF-8"); 和result.getBytes("utf-8")
有什么不同嗎?還請您賜教

厄,如果對字符編碼沒概念的話,解釋起來很麻煩。
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的有小部分編碼集合是一樣的,所以英文字符,一般不管怎么轉都可以歪打正著。
7 樓 bashenmail 2009-11-21 引用
eleda 寫道
melode11 寫道
result = new String(result.getBytes(),"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的,要不也不會出現亂碼,可能是我表達不清
6 樓 bashenmail 2009-11-21 引用
melode11 寫道
result = new String(result.getBytes(),"UTF-8"); 這句莫名其妙的。
如果源真的是GB2312,那么InputStreamReader讀入的已經是正確的值了。
如果想要把result按utf-8編碼存到某文件, 那么 result.getBytes("utf-8")得到字節(jié)數組,再寫入 outputStream才是對的。

Java代碼 復制代碼 收藏代碼
  1. result = new String(result.getBytes(),"UTF-8"); 和result.getBytes("utf-8")
有什么不同嗎?還請您賜教
5 樓 eleda 2009-11-18 引用
melode11 寫道
result = new String(result.getBytes(),"UTF-8"); 這句莫名其妙的。
如果源真的是GB2312,那么InputStreamReader讀入的已經是正確的值了。
如果想要把result按utf-8編碼存到某文件, 那么 result.getBytes("utf-8")得到字節(jié)數組,再寫入 outputStream才是對的。

嗯,這段的確有問題!
如果系統(tǒng)的默認編碼是utf-8還好。
如果不是的話,result = new String(result.getBytes(),"UTF-8"); 這句就是亂碼的源泉!
4 樓 melode11 2009-11-17 引用
result = new String(result.getBytes(),"UTF-8"); 這句莫名其妙的。
如果源真的是GB2312,那么InputStreamReader讀入的已經是正確的值了。
如果想要把result按utf-8編碼存到某文件, 那么 result.getBytes("utf-8")得到字節(jié)數組,再寫入 outputStream才是對的。
3 樓 bashenmail 2009-11-16 引用
changsir 寫道
收藏,仔細研究。謝謝樓主分享!

不敢當,也許會有更好的辦法呢
2 樓 changsir 2009-11-16 引用
收藏,仔細研究。謝謝樓主分享!
1 樓 syluke 2009-11-03 引用
多謝分享!你的代碼解決了我的問題。受教了。

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多