弓背霞明剑照霜,秋风走马出咸阳。这篇文章主要讲述android http通信之HttpURLConnection post乱码问题相关的知识,希望能为你提供帮助。
楼主前段时间做android项目,用到http通信,于是楼主本着练手的态度,自己写httpUrlConnection通信过程,然后在测试的时候,发现使用post请求一直乱码,这时候楼主开始看发送的数据,发现发送的数据是正确的,没有乱码,是utf-8的,然后又看服务器的代码,没错,也进行了转码的操作,那么,到底是哪出问题了呢?这个困扰了楼主好久,后来,楼主无意中发现,书中(第一行代码)进行通信时,post请求数据使用的是如下代码:
ad(new Runnable() { @Override public void run() { HttpURLConnection connection = null; try { URL url = new URL(address); connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setDoOutput(true); connection.setConnectTimeout(8000); connection.setReadTimeout(8000); DataOutputStream out = new DataOutputStream(connection.getOutputStream()); out.write(data.getBytes()); InputStream in = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); StringBuilder response = new StringBuilder(); String line; while ((line=reader.readLine())!=null) { response.append(line); }
然而楼主在使用out.write(data.getBytes())时,写成了out.writeBytes(data)。可以说是非常微小的一个差别,那么当楼主将这行代码改完后,进行测试,发现乱码问题解决了,然后楼主就蒙了,什么鬼,这有两函数有区别吗???后来楼主查阅资料,发现这两函数的确有非常非常大的区别。
前者是将data(string类型)转换为byte数组,然后传输。这个是没有问题的。那后者是怎么转换的呢,看下其源代码:
文章图片
这时候问题出现了,看s.length(); 对于中文,获得长度是字的长度,以下是验证截图:
【android http通信之HttpURLConnection post乱码问题】
文章图片
文章图片
、
我们都知道,汉字的存储都是两个字节的,但是获得长度是3个,所以进行强转必定会出现截取调一部分数据,因此乱码,以下是实验截图:
文章图片
推荐阅读
- Spring MVC(handlermapping)
- win10 大文件安卓android studio修改 汉化
- [Android] 开发第十一天
- firemonkeyListViewDynamicAppearance
- RobotFramework自动化测试框架-移动手机自动化测试AppiumLibrary介绍
- 安卓android杀不死进程,保护,双进程守护,驻留,Marsdaemon,保活
- Android开发(SharedPreferences 存储数据获取数据)
- Java中的异常处理
- 发送带有HTML内容的电子邮件