目录
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传输规范里面没有特殊字符,而现实中确实要传输字符(比如:汉字)的解决方案。(一般都用于接口开发中)
*/
}