Java基础随笔 BASE64 UrlEncode

本文详细探讨了Java中URL编码的过程,包括URL接口编程处理中的十六进制表示,以及浏览器和Web服务器如何处理URL编码。同时,文章还介绍了BASE64编码原理,它是如何使用[0-9a-zA-Z]和+ /字符对字节流进行编码,以解决HTTP协议下URL传输非标准字符的问题,常用于接口开发。

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

目录

URL 接口编程处理

URL 浏览器和web服务器的处理

BASE64:[0-9a-zA-Z] 和 + / 这64个可打印字符


URL 接口编程处理

/**
* 模仿接口上的编程:
*/

import java.net.URLEncoder;
import java.net.URLDecoder;

public class Test 
{
    public static void main(String[] args) 
    {
        try{

            String s = "我";

            byte[] bu = s.getBytes("UTF-8");
            for(int i=0;i<bu.length;i++)
                System.out.println("bu:["+i+"]=="+bu[i]);

            String sutf8 = new String(bu,"UTF-8");
            System.out.println("bu-utf8-"+ sutf8);
            System.out.println("bu-gbk-"+ new String(bu,"GBK"));


            // 将普通字符创转换成application/x-www-from-urlencoded字符串  
            String sutf8UrlEncode = URLEncoder.encode(sutf8, "UTF-8");  
            System.out.println(sutf8 +" UTF-8: URLEncoder==="+sutf8UrlEncode); //输出 

            // 将application/x-www-from-urlencoded字符串转换成普通字符串  
            String sutf8UrlDecode = URLDecoder.decode(sutf8UrlEncode, "UTF-8");  
            System.out.println(sutf8 +" UTF-8: URLDecoder==="+sutf8UrlDecode); //输出 


            System.out.println("\n\r==========================\n\r");


            byte[] bg = s.getBytes("GBK");
            for(int j=0;j<bg.length;j++)
                System.out.println("bg:["+j+"]=="+bg[j]);

            String sgkb = new String(bg,"GBK");
            System.out.println("bg-utf8-"+ new String(bg,"UTF-8"));
            System.out.println("bg-gbk-"+ sgkb);

            // 将普通字符创转换成application/x-www-from-urlencoded字符串  
            String sgbkUrlEncode = URLEncoder.encode(sgkb, "GBK");  
            System.out.println(sgkb +" GBK: URLEncoder==="+sgbkUrlEncode); //输出 

            // 将application/x-www-from-urlencoded字符串转换成普通字符串  
            String sgbkUrlDecode = URLDecoder.decode(sgbkUrlEncode, "GBK");  
            System.out.println(sgkb +" GBK: URLDecoder==="+sgbkUrlDecode); //输出 


        }catch(Exception e){
        }
    }

 

/**
-1:1111 1111
-2:1111 1110
-3:1111 1101
-4:1111 1100
-5:1111 1011
-6:1111 1010
-7:1111 1001
-8:1111 1000
-9:1111 0111
-10:1111 0110
-11:1111 0101
-12:1111 0100
-13:1111 0011
-14:1111 0010
-15:1111 0001
-16:1111 0000
-17:1110 1111
-18:1110 1110
-19:1110 1101
-20:1110 1100
-21:1110 1011
-22:1110 1010
-23:1110 1001
-24:1110 1000
-25:1110 0111
-26:1110 0110    十六进制 0xE6 对应到urlencode后的值就是 %E6 (一字节8bit)

所谓的urlencode,不过是简单的将字节流,每个字节都用十六进制表示而已,也就是说:
举例:
汉字:我 用utf-8编码,对应的字节流数组bu是三个字节 
bu:[0]==-26    -26 的十六进制表示 0xE6 ,用urlencode的表现形式是 %E6
bu:[1]==-120  -120 的十六进制表示 0x88 ,用urlencode的表现形式是 %88
bu:[2]==-111  -111 的十六进制表示 0x91 ,用urlencode的表现形式是 %91

0000:0
0001:1
0010:2
0011:3
0100:4
0101:5
0110:6
1110:E
1111:F
*/


URL 浏览器和web服务器的处理

/**
HTTP协议:[0-9a-zA-Z] 和 $ - _ . + ! * ' ( ) , 这些字符能用在URL中

Only alphanumerics [0-9a-zA-Z], the special characters "$-_.+!*'()," [not including the quotes - ed], 
and reserved characters used for their reserved purposes may be used unencoded within a URL

页面中的form表单提交,一般写法是:
<form action="#" method="POST" enctype="application/x-www-form-urlencoded">
这里的application/x-www-form-urlencoded意思就是:提交的表单内容都是需要浏览器urlencoded编码的

urlencoded的目的:提交的内容中有大量不符合URL传输规范范围的字符时,urlencode之后,就都可以传输给后台服务器了
一般的web服务器都是会收到http请求时,发现传输过来的请求内容是application/x-www-form-urlencoded时,Web服务器会对内容自动urldecode解码的
至于服务器,解码时,按照什么字符编码集进行解码,这是事先要配置服务器所使用的字符集。
例如:
(1) tomcat服务器
对于tomcat服务器,该文件是server.xml
    <span style="font-size:12px;"><Connector port="8080" protocol="HTTP/1.1"   
                     maxThreads="150" connectionTimeout="20000"   
                     redirectPort="8443" URIEncoding="GBK"/></span>  

URIEncoding告诉服务器servlet解码URL时采用的编码。

<Connector port="8080" ... useBodyEncodingForURI="true" />
useBodyEncodingForURI告诉服务器解码URL时候需要采用request body指定的编码。

(2) weblogic服务器
对于weblogic服务器,该文件是weblogic.xml 
    <span style="font-size:12px;"><input-charset>  
    <java-charset-name>GBK</java-charset-name>  
    </input-charset></span>

*/


BASE64:[0-9a-zA-Z] 和 + / 这64个可打印字符

最早出现在邮件技术中,解决邮件无法发送附件、汉字、图片等问题的技术

也是一种对字节流处理的手段,
客户端每 3个字节 --> 4个字节 (当字节不够3的倍数时,最后补上=等号来补充)
服务端进行返解析 4个字节 --> 3个字节 得到原始的字节流,然后这个字节流的原始字符集编码是什么,在通过字符集编码new(byte[],charset)就能拿到原始的字符串了。。

说白了,这也是一种http协议下url传输规范里面没有特殊字符,而现实中确实要传输字符(比如:汉字)的解决方案。(一般都用于接口开发中)

*/

}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值