1. 为什么需要编码
当数据不利于处理、存储的时候,就需要对它们进行编码。如对字符进行编码是因为自然语言中的字符不利于计算机处理和存储。对图片信息、视频信息、声音信息进行压缩、优化,将其“格式化”,是为了在保证媒体资源质量的同时,尽量的节省网络带宽和本地存储的空间。对URL进行编码,是为了避免URL解析发生歧义,简化解码方式,如:URL采用“&”作为不同参数的分隔符,假如某个特定的参数的名称或者值本身就包括分隔符“&”,如果不将参数中的“&”做编码转换,那势必会增加URL解析的复杂性,提高解析错误的概率。
2. 怎么样进行编码和解码
根据实际需求的差异,编码、解码算法有可能会很复杂,也有可能非常的简单,但是从根本上来讲,编码、解码只是在做翻译工作,将一种形式的数据翻译为另一种形式的数据,如,最简单的编码、解码就是相当于从一个Map中根据key查找value,然后使用value代替实际数据中的key的值。复杂一点儿的编码如javascript中的encodeURIComponent和decodeURIComponent,encodeURIComponent负责将字符串中不符合URL编码规范的字符转换为“%”形式的十六进制Unicode内码序列,decodeURIComponent负责将“%”形式的十六进制Unicode内码序列转换为实际的字符。
@Test public void testUrl(){ String name = "aaaaaaa张三?/..&&"; //name=张三&age=18 //UrlEncode(name=张三&age=18); //UrlEncdoe(name) + = encode(张三) + & + encode(age) + = +encode(18) try { //url编码(客户端给服务器提交数据之前,对数据要进行url编码) String encodeName = URLEncoder.encode(name, "UTF-8"); String url = "http://www.baidu.com?name=" + encodeName; System.out.println("url:" + url); //url解码(服务器收到数据之后, 先进行url解码, 然后再使用) String decodeName = URLDecoder.decode(encodeName, "UTF-8"); System.out.println("name:" + decodeName); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } }
控制台输出结果:
url:http://www.baidu.com?name=aaaaaaa%E5%BC%A0%E4%B8%89%3F%2F..%26%26
name:aaaaaaa张三?/..&&