转载请标明出处:http://blog.csdn.net/ysjyygywfn/article/details/39959907
写文章之前先来吐嘈一下,Android手机实在是太多了,各种型号各种android版本,兼容问题真是头大啊!。。。。
好了,现在开始进入主题。最近两个月我做了个项目,我用了十几个手机测都没有问题,发给客户一用,说手机用流量看内容会乱码!我一听当时就蒙了,只能问下会乱码的手机型号,好在在公司员工找到了那同款手机,拿来一测,还真会乱码!用WIFI看不会,用手机流量看就会!然后测试折腾一番,发现从服务器接收的数据就是乱码!在手机上不管怎么转码都是乱码!(说到这里插一句,我们用的最普遍的中文编码是“UTF-8”和“GB2312”,但这两种编码在服务器上(PHP文件)可以互转,在JAVA环境是不可逆的,意思是就是UTF-8转GB2312后,再转成UTF-8就转不回来了,具体大概就是两种编码存储汉字所用字节数不一样,一个是2个字节代表一个字,一个是3个字节代表一个字!详细的大家可以去查下)然后我就从服务器端找问题,发现原来服务器数据库用的是GB2312编码,我们手机APP端用的是UTF-8编码,服务器端做接口的时候做了编码转换!正常情况下我们接收到的JSON数据就是UTF-8编码的,显示也正常,但个别手机就是不行!为什么会这样我到现在也不明白!现在有两种办法解决:
1.在服务器端数据库改用UTF-8,这样就不会出现转码的情况。自然就不会乱码了!
2.服务器端做接口的时候用GB2312编码,不用转码,手机APP端接收的时候转下码,我试了很多方法转码,对大部分手机都可以,但对那些特殊手机都不行,只能用下面那种!关键代码:
public String loadJSON(String url){
DefaultHttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
// get.setHeaders(headers);
try {
HttpResponse response = client.execute(get);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
// String result = EntityUtils.toString(response.getEntity(),"UTF-8");
String result = EntityUtils.toString(response.getEntity(),"GBK");
Log.e("i", "GBK数据="+result);
if (result==null) {
return "";
}
if (result.startsWith("<")) {
//json数据以"<"开头,返回空字符串
return "";
}
result.trim();
return result;
} else {
Log.e("i", "数据没连上");
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
这样APP端显示就可以正常了,各种手机都可以显示正常了!不管用WIFI还是手机流量!当然为了避免出现这种情况,建议大家数据库和手机端都用统一的编码,就不会这么多事了!
最后顺便说下常用的字符串转码:
String str1 = "汉语";//初始编码为“UTF-8”
String str2 ; //要转换为“GB2312”
str2 = new String(str1.getBytes("UTF-8"),"GB2312");
这样转换就实现了把str1的“UTF-8”编码转换成了“GB2312”编码了!