URL编码 URLEncoder 示例
对字符编码时的规则
通常如果一样东西需要编码,说明这样东西并不适合传输。原因多种多样,如Size过大,包含隐私数据。对于Url来说,之所以要进行编码,一个是因为Url中有些字符会引起歧义。例如Url参数字符串中使用key=value键值对这样的形式来传参,键值对之间以&符号分隔,如/s?q=abc&ie=utf-8。如果你的value字符串中包含了=或者&,那么势必会造成接收Url的服务器解析错误,因此必须将引起歧义的&和=符号进行转义,也就是对其进行编码。另外,Url的编码格式采用的是ASCII码,而不是Unicode(包含中文),这也就是说你不能在Url中包含任何非ASCII字符,例如中文。否则如果客户端浏览器和服务端浏览器支持的字符集不同的情况下,中文可能会造成问题。编码时的规则:
- 【字母】字符 "a" 到 "z"、"A" 到 "Z" 和【数字】字符 "0" 到 "9" 保持不变
- 特殊字符【.】【-】【*】【_】保持不变
- 空格字符 【 】转换为一个加号【+】
- 所有其他字符都是不安全的,因此首先使用一些编码机制将它们转换为【一个或多个】字节,然后每个字节用一个包含 3 个字符的字符串【%xy】表示,其中 xy 为该字节的两位十六进制表示形式。
- 可以指定对这些字符进行解码的编码机制,或者如果未指定的话,则使用平台的默认编码机制。
例如,使用 UTF-8 编码机制,字符串【ü@】将转换为【%C3%BC%40】,因为在 UTF-8 中,字符【ü】编码为两个字节【0xC3和0xBC】,字符【@】编码为一个字节【0x40】。解码时的规则:
- 将把【%xy】格式的子序列视为【一个字节】,其中 xy 为 8 位的两位十六进制表示形式。
- 然后,所有连续包含一个或多个这些字节序列的子字符串,将被其编码可生成这些连续字节的字符所代替。
测试代码
public class Test {public static void main(String[] args) throws Exception {String enc = "UTF-8";test("aA0 .-*_", enc);//编码【aA0+.-*_】解码【aA0 .-*_】test("@", enc);//编码【%40】解码【@】test("ü", enc);//编码【%C3%BC】解码【ü】test("白", enc);//编码【%E7%99%BD】解码【白】test("白", "GBK");//编码【%B0%D7】解码【白】}/*** 测试编解码* @param str 原始字符串* @param enc 对字符串进行URLEncoder和URLDecoder时使用的编码规则* @throws UnsupportedEncodingException*/public static void test(String str, String enc) throws UnsupportedEncodingException {String encode = URLEncoder.encode(str, enc);//推荐 UTF-8。如果未指定,则使用平台的默认编码String decode = URLDecoder.decode(encode, enc);//编码和解码必须使用同一套码表,否则解码时可能乱码System.out.println("原始字符串【" + str + "】编码后【" + encode + "】解码后【" + decode + "】");//获取通过UTF8码表编码的字符串的字节数组byte[] bytes = str.getBytes(enc);System.out.println(" 原始字符串对应的字节数组" + Arrays.toString(bytes));StringBuilder sb = new StringBuilder();for (byte b : bytes) {//手动对【每个字节】都进行上面【类似URLEncoder】编码规则的算法进行编码(即使字母和数字也进行了编码)sb.append(Integer.toHexString(b & 0xFF).toUpperCase() + " ");}System.out.println(" 对每个字节都进行编码【" + sb.toString().trim() + "】");}
//源码public static String decode(String s, String enc) throws UnsupportedEncodingException {boolean needToChange = false;int numChars = s.length();//字符数StringBuffer sb = new StringBuffer(numChars > 500 ? numChars / 2 : numChars);int i = 0;if (enc.length() == 0) throw new UnsupportedEncodingException("URLDecoder: empty string enc parameter");char c;byte[] bytes = null;while (i < numChars) {c = s.charAt(i);//逐个遍历所有字符switch (c) {case '+':sb.append(' ');i++;needToChange = true;break;case '%':try {if (bytes == null) bytes = new byte[(numChars - i) / 3];// (numChars-i)/3 is an upper bound上线 for the number of remaining剩下的 bytesint pos = 0;while (((i + 2) < numChars) && (c == '%')) {int v = Integer.parseInt(s.substring(i + 1, i + 3), 16);//16进制if (v < 0) throw new IllegalArgumentException("URLDecoder: Illegal hex characters in escape (%) pattern - negative value");bytes[pos++] = (byte) v;i += 3;if (i < numChars) c = s.charAt(i);}// A trailing, incomplete不完全的 byte encoding such as "%x" will cause an exception to be thrownif ((i < numChars) && (c == '%')) throw new IllegalArgumentException("URLDecoder: Incomplete trailing escape (%) pattern");sb.append(new String(bytes, 0, pos, enc));} catch (NumberFormatException e) {throw new IllegalArgumentException("URLDecoder: Illegal hex characters in escape (%) pattern - " + e.getMessage());}needToChange = true;break;default:sb.append(c);i++;break;}}return (needToChange ? sb.toString() : s);}}
URL编码 URLEncoder 示例的更多相关文章
- 各种编码问题产生原因以及解决办法---------响应编码,请求编码,URL编码
响应编码 产生原因以及解决办法: 示例: package cn.yzu; import java.io.IOException; import javax.servlet.ServletExcept ...
- PHP转换UTF-8和GB2312的URL编码(转)
目前WEB的应用中, UTF-8编码和GB2312编码是并存在的,例如百度(baidu.com)和谷歌(google.com)的URL编码分别是GB2312编码和UTF-8编码.由于编码并存引起的乱码 ...
- Atitit.软件开发概念(11)--网络子系统--url编码 空格问题URLEncoder java js php
Atitit.软件开发概念(11)--网络子系统--url编码 空格问题URLEncoder java js php 1. RFC2396标准 including HTML 4.01 section ...
- Web开发须知:URL编码与解码
通常如果一样东西需要编码,说明这样东西并不适合传输.原因多种多样,如Size过大,包含隐私数据,对于Url来说,之所以要进行编码,是因为Url中有些字符会引起歧义. 例如,Url参数字符串中使用key ...
- javaweb请求编码 url编码 响应编码 乱码问题 post编码 get请求编码 中文乱码问题 GET POST参数乱码问题 url乱码问题 get post请求乱码 字符编码
乱码是一个经常出现的问题 请求中,参数传递的过程中也是经常出现乱码的问题 本文主要整理了请求乱码中的问题以及解决思路 先要理解一个概念前提: 编码就是把图形变成数值码所以说: 图形的字符 -- ...
- url 编码(percentcode 百分号编码)(转载)
原文地址:http://www.cnblogs.com/leaven/archive/2012/07/12/2588746.html http://www.imkevinyang.com/2009 ...
- 浏览器URL编码
jsp页面中通过请求另一个页面并通过url传递了带有中文的参数,结果在接收端获取参数时乱码了 经检查乱码现象指出新在IE浏览器中,其他浏览器火狐.chrome等不会有问题 最后的解决方式是: 手动将此 ...
- 详解JavaScript中的Url编码/解码,表单提交中网址编码
本文主要针对URI编解码的相关问题做了介绍,对Url编码中哪些字符需要编码.为什么需要编码做了详细的说明,并对比分析了Javascript 中和 编解码相关的几对函数escape / unescape ...
- url 编码(percentcode 百分号编码)
http://www.imkevinyang.com/2009/08/%E8%AF%A6%E8%A7%A3javascript%E4%B8%AD%E7%9A%84url%E7%BC%96%E8%A7% ...
随机推荐
- Junit4 架构设计系列(2): Runner.run()与Statement
Overall 系列入口: Junit4 架构设计系列(1): Request,ClassRequest 和 RunnerBuilder 前文中,我们基本理清了Junit4执行Case大体上的Flow ...
- 领域驱动设计(Domain Driven Design)参考架构详解
摘要 本文将介绍领域驱动设计(Domain Driven Design)的官方参考架构,该架构分成了Interfaces.Applications和Domain三层以及包含各类基础设施的Infrast ...
- LightOj_1342 Aladdin and the Magical Sticks
题目链接 题意: 地上有n种棍子, 其中有两种类型, 一种类型是可识别, 一种类型是不可识别, 每个棍子都有一个权值. 当你捡到可识别的, 那么你以后就不会再捡这个棍子, 如果是不可识别的, 那么你有 ...
- [BZOJ 3564] [SHOI2014] 信号增幅仪 【最小圆覆盖】
题目链接:BZOJ - 3564 题目分析 求最小椭圆覆盖,题目给定了椭圆的长轴与 x 轴正方向的夹角,给定了椭圆长轴与短轴的比值. 那么先将所有点旋转一个角度,使椭圆长轴与 x 轴平行,再将所有点的 ...
- [BZOJ 3894] 文理分科 【最小割】
题目链接:BZOJ - 3894 题目分析 最小割模型,设定一个点与 S 相连表示选文,与 T 相连表示选理. 那么首先要加上所有可能获得的权值,然后减去最小割,即不能获得的权值. 那么对于每个点,从 ...
- 当用DJANGO的migrate不成功时。。。。
URL:http://my.oschina.net/u/862582/blog/355421 因为操作SQL数据库时不规范,或是多人开发时产生了同步问题,就可能导致正规的MIGRATE时不能完成. 已 ...
- hadoop单机安装
1.解压hadoop-1.0.3-bin.tar.gz放到指定目录下. 2.安装java环境,参照文档 3.Ssh无密登录 4.修改conf下四个文件 Hadoop-env.sh: export JA ...
- bzoj2120 2453
明显的数据结构题这道题的特殊性在于n只有10000,修改的操作只有1000那么就是说即便是O(n)的修改也没有太大的问题,只要常数写小一点即可考虑到以前对同色点的处理pre[i]表示与这个位置同色的前 ...
- 连接池 BoneCPDataSource
一篇连接池不错的文章 http://blog.csdn.net/vincent_czz/article/details/7646392
- VS 2010不显示头文件源文件和所有以前分类的文件夹,*.h 和*.cpp都显示在同一个文件
打开VS后不显示头文件源文件和所有以前分类的文件夹,*.h 和*.cpp都显示在同一个文件 点击右图红色指示显示所有文件夹按钮,就能恢复.
