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();对于中文,获得长度是字的长度,以下是验证截图:

  

  我们都知道,汉字的存储都是两个字节的,但是获得长度是3个,所以进行强转必定会出现截取调一部分数据,因此乱码,以下是实验截图:

时间: 2024-10-29 19:05:48

android http通信之HttpURLConnection post乱码问题的相关文章

基于mina的的android即时通信app

前段时间研究mina框架,发现很适合做即时通信后台,经过几个月的研发本人开发了一套基于mina框架的android即时通信app,暂命名为E聊.鉴于本人能力有限还存在不少bug,希望大家原谅并指出,bug和部分功能还在不断完善中,过段时间部分代码会进行开源,敬请关注. 主要功能包括: 1.私聊,群聊 2.支持文字.语音.图片.文件.小视频等 3.位置共享(开发中) 4.朋友圈(图文发布.评论等,小视频功能正在开发中) 5.上线通知,断线重连 6.接收离线消息 7.更多功能正在筹划中... 演示图

android IPC通信(下)-AIDL

android IPC通信(上)-sharedUserId&&Messenger android IPC通信(中)-ContentProvider&&Socket 这篇我们将会着重介绍AIDL的使用方式和原理,要介绍AIDL先要简单介绍一下Binder,而且Messenger,ContentProvider和AIDL的最底层都是使用的Binder. Binder 直观来说,Binder是Android中的一个类,它实现了IBinder接口.从IPC角度来说,Binder是A

Android线程通信

摘要 andriod提供了 Handler 和 Looper 来满足线程间的通信.例如一个子线程从网络上下载了一副图片,当它下载完成后会发送消息给主线程,这个消息是通过绑定在主线程的Handler来传递的. 正文 图解: 代码示例: /** * @author allin.dev * http://allin.cnblogs.com */ public class MainThread extends Activity { private static final String TAG = "M

android UDP通信

Android UDP通信很简单的,调用下面这个方法就可以实现客户端和服务端的UDP通信, 只需要把要发给服务器的数据转成一个byte数组格式传进去就行了. /**客户端向服务器端发送UDP数据*/ public static void sendUdpData(final byte[] bytesToSend) { new Thread(){ @Override public void run() { try{ //IP是服务器地址 InetAddress serverAddress = Ine

[转]PHP,Android,IOS通信之AES128加解密

转自:http://s00s10.blog.163.com/blog/static/43988552201411913011459/ android上使用: mcrypt = new MCrypt(); /* 加密*/ String encrypted = MCrypt.bytesToHex( mcrypt.encrypt("需加密的字符") ); /* 解密*/ String decrypted = new String( mcrypt.decrypt( encrypted ) );

Android组件通信(章节摘要)

1,不同的Activity之间的跳转可以使用Intent完成,用户也可以通过onActivityResult()方法来接收Activity返回的结果. 2,在Android操作系统中,提供了多个可以操作的Intent,用户只需要设置好要跳转的Action以及附加的若干数据即可实现这些程序的调用. 3,Activity的生命周期包括运行态(Running State),暂停态(Pauserd State)和停止态(Stopped State). 4,使用ActivityGroup要比使用TabHo

【Android进阶】使用HttpURLConnection实现图片的下载与现显示

虽然我们在开发中经常使用别人已经开发好的开源框架,但是,了解这些框架底层的实现,能够让我们更好的理解功能的实现. 这篇文章主要介绍使用HttpURLConnection对象,实现图片文件的下载,以及显示. 我们的思路是,首先使用HttpURLConnection实现图片文件的下载,在下载结束之后,使用handler异步的显示图片. 因为功能比较简单,我只把代码贴在下面,注释很详细 /** * 使用HttpURLConnection实现图片的下载与现显示 * * @author ZhaoKaiQi

【Android进阶】使用HttpURLConnection实现网页源码的下载

上一篇文章主要介绍的图片文件的下载与显示,这一篇文章主要介绍如何根据网页的地址,获取网页源代码的获取 其实,网站源代码的获取比图片的下载与显示更加简单,只需要对之前的代码稍作修改即可 public class OtherActivity extends Activity { private TextView tv; private static final int LOAD_SUCCESS = 1; private static final int LOAD_ERROR = -1; privat

Android串口通信(基于Tiny6410平台)

友善之臂的Android系统有他们自己编写的一个串口通信程序,网上没有找到他的源代码,而且界面操作不在一个界面,不是很方便,这里我自己写了一个粗糙点的串口通信程序. 同样这里还是调用友善之臂的friendlyarm-hardware.so库文件. 在Android工程文件下面加入com.friendlyarm.androidSDK包,在其下添加HardwareControler.java.下面我把我做的截图发上来. 主程序代码: package geekle.lab; import androi