- 浏览: 2141982 次
- 性别:
- 来自: 合肥
文章分类
- 全部博客 (401)
- Agile (16)
- Apache Commons (3)
- Architecture (8)
- DB.MongoDB (5)
- DB.Mysql (3)
- DB.Oracle (34)
- DirectoryService (1)
- DotNet (1)
- English (3)
- Groovy (0)
- Html (28)
- Java (67)
- Java.Aixs (7)
- Java.Cache (2)
- Java.jPBM (1)
- Java.Resin (6)
- Java.Spring (4)
- Java.Struts2 (5)
- Java.Tomcat (16)
- Javascript (45)
- Javascript.Google Map (2)
- Javascript.Jquery (8)
- Life (15)
- Maven&Ant (4)
- Network (5)
- OS.Linux (45)
- OS.Windows (10)
- OS.Windows.Office (1)
- PlayFramework (15)
- Python (28)
- Reading notes (11)
- Security (13)
- Server.Apache (3)
- Server.Nginx (7)
- Test (6)
- Tool (15)
- Work.Solution (15)
- Other (20)
- SSO&CAS&Identity (13)
最新评论
-
hutuxiansheng123:
防火墙、Iptables、netfilter/iptables、NAT 概述 -
dacoolbaby:
非常棒的正则表达式,非常适用。万分感谢。
用python分析nginx的access日志 -
loot00:
您好! 我也遇到了相同的错误信息。我是用f_link_lob ...
LOB variable no longer valid after subsequent fetch -
feihangchen:
@OnApplicationStop public clas ...
Play framework 1.2.3 Jobs定时任务、异步任务、引导任务、触发任务、关闭任务 -
洞渊龙王:
谢谢了
www.w3.org被qiang导致logback报错:Connect reset
字符集对Encoder的影响,其实就是字符在不同字符集下编码不同,即使用的字节数不同,而每个字节都用2个16进制的字母在url中表示(它们之间的关系是,第一个16进制数代表一个字节的前4位,后一个16进制数代表一个字节的后4位!)
相应的我们可以看到,Tomcat中类org.apache.catalina.util.RequestUtil对url进行转码的方法,其中case '%'后面,data[ox++] = (byte)((convertHexDigit(data[ix++]) < < 4) + convertHexDigit(data[ix++]));就是根据这个规则来把%xx,转成字节,然后根据字节以及编码,转成正确的字符串。同时从convertHexDigit方法可以看出,%后面的字母是大小写不敏感的。
URLEncode,RFC 3986規範了哪些字符是作為保留字(如:!、@、/、?等),如果URL中使用到了這些保留字,就必須將它編碼為「%HEXHEX」的16进制形式[/color],舉例來說,「空白字元」的 ASCII code 是32,所以會被編碼為 %20,而其它 non-ASCII 字元(如:中文字)則以 UTF-8 字元編碼後的字节数组來編碼成 %HEXHEX 的形式(每个字节8位,取值在-128-127之间,用2个16进制的值来表示)。(这样就是在URL中用US-ASCII字符来表示非US-ASCII或者URL保留字的值)
在 RFC 3986 之前,HTTP 也有為 GET/POST 在傳遞參數時的 url encode 方式作定義,基本上也是 encode 成 %HEXHEX 的形式,保留字跟 RFC 3986 的有部份出入,不過就沒有限定一定是 UTF-8 的文字編碼了,而且還有一個重點--「空白字元」會被編碼成 + 而不是 %20。
常用語言的函式庫
因為有這樣的差異,所以開發人員在使用函式庫的時候常常會搞混什麼時候該用/不該用什麼函式,以 PHP 來說就分為兩組函式:
urlencode / urldecode
簡單地說就是以 HTTP 所使用的 application/x-www-form-urlencoded 的編碼規則,也就是會將空白字元編碼成 + 而不是%20。
rawurlencode / rawurldecode
按照 RFC 3986 所定義的方式來作編碼。
Python 版本的話就是:
urllib.urlencode / urllib.urldecode
會把空白字元編碼成 +
目前要使用 Python 3 以後的 urllib.parse.urlencode 才會按照 RFC 3986 的方式來作編碼,若是 2.x 的版本就要另外處理或是找 3rd-party 資料庫來做。
JavaScript 的 encodeURI 或是 encodeURIComponent (兩者僅相差一些保留字是否要作編碼,如 #)目前則是都使用 RFC 3986 的方式來作編碼,所以要作 application/x-www-form-urlencoded 的編碼時(AJAX POST),就要自己把 %20 替換成 + (jQuery 目前的程式碼就是這樣做的)
Java 的 java.net.URLEncoder.encode 這個 method 也是編碼成 application/x-www-form-urlencoded 的方式,如果要遵照 RFC 3986 的定義,則可以自行再把 + 替換成 %20 即可。
参考:混亂的 URLEncode
使用不同的编码,来进行UrlEncoder
汉字“中”,在不同的编码中使用不同长度的字节来表示,而每个字节是8位的,可以用16进制的2个字符来表示,
在UTF-8中用3个字节表示的值:%E4%B8%AD,
而在GB2312编码中用的是2个字节的值:%D6%D0
它们字节的编码没有任何关系,但是可以通过Unicode编码中转后相互转换。
编码后,就把%后跟着2个16进制值的字符传递到服务器上去。
相应的我们可以看到,Tomcat中类org.apache.catalina.util.RequestUtil对url进行转码的方法,其中case '%'后面,data[ox++] = (byte)((convertHexDigit(data[ix++]) < < 4) + convertHexDigit(data[ix++]));就是根据这个规则来把%xx,转成字节,然后根据字节以及编码,转成正确的字符串。同时从convertHexDigit方法可以看出,%后面的字母是大小写不敏感的。
public static void parseParameters(Map map, byte[] data, String encoding) throws UnsupportedEncodingException { if (data != null && data.length > 0) { int ix = 0; int ox = 0; String key = null; String value = null; while (ix < data.length) { byte c = data[ix++]; switch ((char) c) { case '&': value = new String(data, 0, ox, encoding); if (key != null) { putMapEntry(map, key, value); key = null; } ox = 0; break; case '=': if (key == null) { key = new String(data, 0, ox, encoding); ox = 0; } else { data[ox++] = c; } break; case '+': data[ox++] = (byte)' '; break; case '%': data[ox++] = (byte)((convertHexDigit(data[ix++]) < < 4) + convertHexDigit(data[ix++])); break; default: data[ox++] = c; } } //The last value does not end in '&'. So save it now. if (key != null) { value = new String(data, 0, ox, encoding); putMapEntry(map, key, value); } } } private static byte convertHexDigit( byte b ) { if ((b >= '0') && (b <= '9')) return (byte)(b - '0'); if ((b >= 'a') && (b <= 'f')) return (byte)(b - 'a' + 10); if ((b >= 'A') && (b <= 'F')) return (byte)(b - 'A' + 10); throw new IllegalArgumentException(sm.getString("requestUtil.convertHexDigit.notHex",Character.valueOf((char)b))); }
URLEncode,RFC 3986規範了哪些字符是作為保留字(如:!、@、/、?等),如果URL中使用到了這些保留字,就必須將它編碼為「%HEXHEX」的16进制形式[/color],舉例來說,「空白字元」的 ASCII code 是32,所以會被編碼為 %20,而其它 non-ASCII 字元(如:中文字)則以 UTF-8 字元編碼後的字节数组來編碼成 %HEXHEX 的形式(每个字节8位,取值在-128-127之间,用2个16进制的值来表示)。(这样就是在URL中用US-ASCII字符来表示非US-ASCII或者URL保留字的值)
在 RFC 3986 之前,HTTP 也有為 GET/POST 在傳遞參數時的 url encode 方式作定義,基本上也是 encode 成 %HEXHEX 的形式,保留字跟 RFC 3986 的有部份出入,不過就沒有限定一定是 UTF-8 的文字編碼了,而且還有一個重點--「空白字元」會被編碼成 + 而不是 %20。
常用語言的函式庫
因為有這樣的差異,所以開發人員在使用函式庫的時候常常會搞混什麼時候該用/不該用什麼函式,以 PHP 來說就分為兩組函式:
urlencode / urldecode
簡單地說就是以 HTTP 所使用的 application/x-www-form-urlencoded 的編碼規則,也就是會將空白字元編碼成 + 而不是%20。
rawurlencode / rawurldecode
按照 RFC 3986 所定義的方式來作編碼。
Python 版本的話就是:
urllib.urlencode / urllib.urldecode
會把空白字元編碼成 +
目前要使用 Python 3 以後的 urllib.parse.urlencode 才會按照 RFC 3986 的方式來作編碼,若是 2.x 的版本就要另外處理或是找 3rd-party 資料庫來做。
JavaScript 的 encodeURI 或是 encodeURIComponent (兩者僅相差一些保留字是否要作編碼,如 #)目前則是都使用 RFC 3986 的方式來作編碼,所以要作 application/x-www-form-urlencoded 的編碼時(AJAX POST),就要自己把 %20 替換成 + (jQuery 目前的程式碼就是這樣做的)
Java 的 java.net.URLEncoder.encode 這個 method 也是編碼成 application/x-www-form-urlencoded 的方式,如果要遵照 RFC 3986 的定義,則可以自行再把 + 替換成 %20 即可。
参考:混亂的 URLEncode
使用不同的编码,来进行UrlEncoder
汉字“中”,在不同的编码中使用不同长度的字节来表示,而每个字节是8位的,可以用16进制的2个字符来表示,
在UTF-8中用3个字节表示的值:%E4%B8%AD,
而在GB2312编码中用的是2个字节的值:%D6%D0
它们字节的编码没有任何关系,但是可以通过Unicode编码中转后相互转换。
编码后,就把%后跟着2个16进制值的字符传递到服务器上去。
try { System.out.println(((byte) 0x01)); // 汉字“中”用UTF-8进行URLEncode的时候,得到%e4%b8%ad(对应的ISO-8859-1的字符是ä¸) String item = new String(new byte[] { (byte) 0xe4, (byte) 0xb8, (byte) 0xad }, "UTF-8"); // 中 System.out.println(item); item = new String(new byte[] { (byte) 0xe4, (byte) 0xb8, (byte) 0xad }, "ISO-8859-1"); // ä¸ System.out.println(item); System.out.println(new BigInteger("253").toByteArray()); System.out.println(Integer.toBinaryString(253)); // 中 item = new String(item.getBytes("ISO_8859_1"), "UTF-8"); System.out.println(item); // ä¸ item = new String(item.getBytes("UTF-8"), "ISO_8859_1"); System.out.println(item); // %E4%B8%AD System.out.println(URLEncoder.encode("中", "UTF-8")); // %3F System.out.println(URLEncoder.encode("中", "ISO-8859-1")); // %D6%D0 System.out.println(URLEncoder.encode("中", "GB2312")); // 中文 System.out .println(URLDecoder.decode("%E4%B8%AD%E6%96%87", "UTF-8")); // 乱码 ?? System.out.println(URLDecoder.decode("%3F%3F", "ISO-8859-1")); // 中文 System.out.println(URLDecoder.decode("%D6%D0%CE%C4", "GB2312")); // 乱码 涓�� System.out.println(URLDecoder .decode("%E4%B8%AD%E6%96%87", "GB2312")); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); }
发表评论
-
CAS_SSO单点登录实例详细步骤(转)、Tomcat ssl(https) 配置
2012-10-17 15:35 295970, 从CAS官网下载最新版本的CAS服务器:cas-serv ... -
CSS link、@import、media type、media query
2012-08-22 10:42 1878CSS link、@import共同点:都是为了加载CSS文件 ... -
IE兼容模式及客户端兼容模式、服务器端兼容模式设置
2012-08-20 16:24 12814IE兼容模式: 为了帮助 ... -
IE 条件注释(转)
2012-08-20 14:20 901一、条件注释简介 IE中的条件注释(Conditional ... -
Css样式覆盖顺序
2012-08-13 16:34 51891,css样式选择器的优先级为:“元素上的style” &g ... -
css属性 :after :before content css伪元素
2012-08-01 15:47 2082:after:伪元素在元素之后添加内容。 这个伪元素允许创作人 ... -
CSS3 圆角属性border-radius、边框阴影属性box-shadow、文字阴影text-shadow、文本裁剪省略text-overflow
2012-07-31 15:37 10191相关CSS圆角属性: border-radius:CSS3标准 ... -
onblur后下一个获取焦点的控件判断、html当前活跃控件、jquery版本查看、jquery查看浏览器版本、setTimeout&setInterval
2012-07-13 15:20 7246需求: input控件在失去 ... -
html中label宽度设置、非替换元素和替换元素
2012-07-05 09:02 12244<label style="float:l ... -
css属性 background
2012-06-21 14:12 885参考:http://www.w3school.com.cn/c ... -
css属性 list-style 纵向菜单、横向菜单
2012-06-20 09:49 6636参考:ul li css 做横向菜 ... -
css属性 text-decoration outline clear overflow text-indent
2012-06-20 09:02 1124参考:http://www.w3school.co ... -
pageX, pageY, screenX, screenY, clientX, clientY
2012-06-18 11:03 1489pageX, pageY, screenX, screenY, ... -
css position, display, float 内联元素、块级元素
2012-06-18 10:16 5817参考:jQuery offset,positi ... -
jQuery offset,position,offsetParent,scrollLeft,scrollTop html控件定位 css position属
2012-06-16 10:17 9300定位应用:点击一个按钮,然后在按钮的右边弹出一个提示框 1,提 ... -
使用ajax和history.pushState无刷新改变页面URL onpopstate(转)
2012-04-10 13:20 11528var htmlData1 = $.ajax( ... -
HTTP Chunk分块&java.io.IOException: CRLF&missing CR
2012-03-22 10:29 14219总结: HTTP 1.1时,Respons ... -
Fiddler常用操作&设置
2012-03-21 14:07 24195Fiddler是一个Web调试代理 ... -
tomcat reload&autodeploy log4j static静态变量 空指针错误
2012-03-13 13:30 4328默认情况下,Tomcat在启动时会自动加载webapps目录下 ... -
本机、生产环境Tomcat乱码处理
2012-03-05 11:05 1960项目由很多模块构成,且每个人负责自己的模块,并且由于历史原因, ...
相关推荐
j2ME URLEncoder Vs URLDEcoder
URLEncoder与URLDecoder的应用 对中文字符进行utf-8编码与解码 希望对各位有用
J2ME URLEncoder 和 URLDecoder 类的实现 实现J2ME没有的API
使用URLDecoder和URLEncoder 区别
主要介绍了java 使用 URLDecoder 和 URLEncoder 对中文字符进行编码和解码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
java中的URLEncoder和URLDecoder类.docx
字符集转换_SAP字符集转换_SAP字符集转换_SAP
主要给大家介绍了关于java中URLEncoder.encode与URLDecoder.decode处理url特殊参数的方法,文中介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
主要介绍了java 使用URLDecoder和URLEncoder对中文进行处理的相关资料,需要的朋友可以参考下
360 degree rotary encoder read data by ethernet
主要为大家详细介绍了UrlDecoder和UrlEncoder使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
hexdecode 将16进制字符串以指定字符集进行解码成字符 hexencode 将字符串指定字符集进行编码成16进制字符串 hexstring 将字符串指定字符集进行编码成16进制字符串 power 求数字的幂函数 replace 将指定字符串中的源...
urlencoder 在Node.js中实现Java Land URLEncoder安装$ npm install urlencoder 例子超级简单: var encoder = require ( 'urlencoder' ) ;encoder . encode ( '哈哈' ) ;执照麻省理工学院
HTML 格式编码的实用工具类。该类包含了将 String 转换为 application/x-www-form-urlencoded MIME 格式的静态方法。下文通过实例代码给大家介绍Java中的UrlDecoder 和 UrlEncoder知识,感兴趣的的朋友一起看看吧
在这里碰到的问题是:调用java.net.URLEncoder的encode()方法时,如果没有显示指定字符集参数,那么URLEncoder会使用默认字符集。这个默认字符集在Eclipse里跑main()方法和在Tomcat里跑Web应用,得到的结果不一样,...
C++ 版本UrlEncoder编码解码工具:支持ANSIC和UTF8格式,是URLEncoderHTML 格式编码的实用工具类。详情参照文章:...
支持UTF8、16、32编解码。
UniEncoder解码库-可以快速解码和编码,日常开发中经常会进行对字符串的各种编码和解码,很方便。
1.驼峰下换线互转 2.拼接前缀、后缀 3.urlencoder、urldecoder
表达式引擎:URL编码器附加组件用于Expression Engine 3或更高版本的附加组件,可使用PHP 函数或函数对字符串进行url编码。安装将urlencoder目录复制到您的system / user / addons文件夹中登录到Expression Engine...