android 中文亂碼總結

1:兩端格式對應
URLEncoder.encode("");
URLDecoder.decode("");


2:按原來的格式轉換成 byte 再按需要的格式轉換成另一個格式
EncodingUtils.getString(data.getBytes("GB2312"), "UTF-8");  
result.getBytes("utf-8")
result.getBytes() 是 new String(byte[]) 的逆過程。
前面那個是 String->byte[] ,後面那個是 byte[] -> String.
在java運行時的時候,String與String是沒有區別的都是以2字節的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.


3:設置網絡傳輸格式而不僅僅是本地格式(eclipse編碼格式等)。
Andorid,IPHONE的HTTP頭。
發現其中的content-type 不一樣。
Andorid :content-type:application/x-www-form-urlencoded;
IPHONE:content-type:application/x-www-form-urlencoded; charset=utf-8
於是嘗試在請求的時候加個頭
request.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");


4:http://blog.csdn.net/shiqidide/article/details/6987449
http://hi.baidu.com/wizardchilde/item/6a257c0ecb02cbcd91571827
5:本人使用的android 通過http 協議傳值服務端利用struts2接收中文出現亂碼結果過程如下:
手機端路徑:
http://192.168.10.110:8080/wsn_web/register?userInfo.userName=張山"+"&userInfo.userPass=55555"+"&userInfo.sex=男";
由於http 傳輸過程中會把中文轉換成ISO8859-1,所以即使你在手機端和服務器端都設成UTF-8可能還會有點問題。
解決的問題就是在服務器端再做一次編碼轉換
如:
userInfo.setUserName(new String(userInfo.getUserInfoName().getBytes("ISO8859-1"),"UTF-8"));
這樣就可以解決問題了。
有用的頂起啊! 
5:多麼操蛋的中文亂碼。剛看了下,腦子都大了,以後再說吧!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章