Android 中的URLEncoder和URLDecoder

本文介绍了URL编码的基本原理,包括为何需要进行URL编码、编码的具体规则及其应用场景。特别关注于GET和POST请求中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

URLEncode 简单一句话,URLEncoding 就是为了将网址中的非ASCII码内容,转换成可以传输字符
 
在编码的时候,保留所有英文字母,数字,以及特定的字符,(这些字符全部都是ASCII中的),除此之外将会转换为十六进制标识,并且在每一个十六进制之前加上%,内容中的' '空格,全部采用加号+替换

URLEncoding 的格式,将要转换的内容,用十六进制表示法转换出来,然后每一个字节表示之前,用%开头;例如0x9c字节经过URLEncoding 就变成了%9C


编码的时候使用URLEncoder,解码的时候使用URLDecoder

编码  String encode = URLEncoder.encode("千雅爸爸", "UTF-8");//第二个参数一定要是服务器段支持的格式
解码  String decoderString = URLDecoder.decode("%E5%8D%83%E9%9B%85%E7%88%B8%E7%88%B8","UTF-8");

package tech.androidstudio.encodecryp;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Arrays;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        urlEncodingTest();
    }

    /**
     *URLEncode 简单一句话,URLEncoding 就是为了将网址中的非ASCII码内容,转换成可以传输字符

     在编码的时候,保留所有英文字母,数字,以及特定的字符,(这些字符全部都是ASCII中的),除此之外将会转换为十六进制标识,并且在每一个十六进制之前加上%
     内容中的' '空格,全部采用加号+替换
     URLEncoding 的格式,将要转换的内容,用十六进制表示法转换出来,然后每一个字节表示之前,用%开头;例如0x9c字节经过URLEncoding 就变成了%9C

     应用场景:所有GET请求,网址用到中文的情况,以及POST请求中,所有的Key 和Value,在提交之前,必须要经过URLEncoding

     */
    public void urlEncodingTest(){
        try {
            //URLEncoder的编码
            String encode = URLEncoder.encode("千雅爸爸", "UTF-8");//第二个参数一定要是服务器段支持的格式
            Log.d("kodulf","千雅爸爸 的URLEncoding 是"+encode);

            //URLDecoder的解码:
            String decoderString = URLDecoder.decode("%E5%8D%83%E9%9B%85%E7%88%B8%E7%88%B8","UTF-8");
            Log.d("kodulf","%E5%8D%83%E9%9B%85%E7%88%B8%E7%88%B8 URLDecoder的解码为:"+decoderString);


        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

    }
}

03-22 06:18:27.934 366-366/? D/kodulf: 千雅爸爸 的URLEncoding 是%E5%8D%83%E9%9B%85%E7%88%B8%E7%88%B8
03-22 06:18:27.945 366-366/? D/kodulf: %E5%8D%83%E9%9B%85%E7%88%B8%E7%88%B8 的解码为:千雅爸爸



应用场景:所有GET请求,网址用到中文的情况,以及POST请求中,所有的Key 和Value,在提交之前,必须要经过URLEncoding
package tech.androidstudio.readfileshttpurlconnection;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity implements Runnable {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

//        Thread thread = new Thread(this);
//        thread.start();

        URL url = null;
        try {
            //定义存储要提交的数据的Map
            //如果 仅仅是为了测试那么直接使用
            //测试的请求+++++++++++++开始+++++++++++++++
            //StringBuilder sb = new StringBuilder("username=哈哈&password=psw");
            //测试的请求++++++++++++++结束++++++++++++++

            //如果为了模拟真实的请求,那么就使用下面的
            //模拟真实的请求+++++++++++++开始+++++++++++++++
            HashMap<String,String> params = new HashMap<String,String>();
            params.put("username", "哈哈");
            params.put("password", "psw");
            //把要提交的 数据类型定义为 username=哈哈&password=psw的格式
            StringBuilder sb = new StringBuilder();
            //通过Map的遍历的到
            for(Map.Entry<String,String> en:params.entrySet()){
                    sb.append(en.getKey())
                            .append("=")
                            .append(URLEncoder.encode(en.getValue(), "utf-8"))
                            .append("&");
            }
            //删除最后一个&,注意 这里是 length-1,因为是从0开始计数的。
            sb.deleteCharAt(sb.length()-1);
            //模拟真实的请求++++++++++++++结束++++++++++++++

            url = new URL("http://192.168.1.106:8080/ServerDemo/servlet/LoginServlert");
            HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();

            urlConnection.setRequestMethod("POST");
            urlConnection.setConnectTimeout(5000);
            urlConnection.setDoInput(true);
            urlConnection.setDoOutput(true);//设置可以向服务器传递数据

            //设置提交的内容的类型
            urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

            //设置提交的内容的长度
            byte[] data = sb.toString().getBytes("utf-8");//注意这里的编码utf-8
            urlConnection.setRequestProperty("Content-Length", String.valueOf(data.length));

            //提交数据
            OutputStream outputStream = urlConnection.getOutputStream();
            outputStream.write(data);
            outputStream.close();


            //判断服务器端的响应码是不是200
            InputStream in = urlConnection.getInputStream();
            if(urlConnection.getResponseCode()==200){
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                byte[] arr = new byte[1024];
                int len=0;
                while((len=in.read(arr))!=-1){
                    bos.write(arr,0,len);
                }

                byte[] b = bos.toByteArray();
                String ss = new String(b,"utf-8");
                Log.d("kodulf","kodulf"+ss);

            }
            //关闭流
            in.close();


        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

    @Override
    public void run() {
        try {
            //配置 HttpURLConnection

            //TODO 这里的ip 地址一定不能使localhost 一定要是电脑的或者是正式ip地址.
            //如果写成了localhost,那么就会报错java.net.ConnectException: localhost/127.0.0.1:8080 - Connection refused
            //URL url = new URL("http://localhost:8080/tomcat.png");
            URL url = new URL("http://192.168.1.106:8080/tomcat.png");
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("GET");
            httpURLConnection.setConnectTimeout(5000);
            //Sets the flag indicating whether this URLConnection allows input. It cannot be set after the connection is established.
            httpURLConnection.setDoInput(true);

            //获取返回的文件
            InputStream in = null;
            FileOutputStream fos = null;
            if (httpURLConnection.getResponseCode() == 200) {
                in = httpURLConnection.getInputStream();
                //一定不能直接在FileOutputStream里面写文件名,需要添加路径
                //错误的写法:fos = new FileOutputStream("a.bmp");
                //下面存储到内部存储的私有的cache目录里面,注意了生成的文件名是cachea.bmp
                fos = new FileOutputStream(getCacheDir().getPath()+"a.bmp");
                byte[] arr = new byte[1024];
                int len = 0;
                //每次读取 1024个字节,如果读取返回为-1说明到了文件的末尾,结束读取
                while ((len = in.read(arr)) != -1) {
                    fos.write(arr, 0, len);
                }
                //一定要记住要关闭读取流。
                in.close();
                fos.close();
            }

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (ProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值