URL编码概述
HTTP协议只支持iso8859-1字符集。
而此字符集中只有英文数字常见符号。
所以HTTP原生是无法传输非iso8859-1字符的。
为了解决这个问题,提出了一种称之为URL编码的解决方案。
URL编解码详解
将非iso8859-1字符,进行转换
先将字符按照指定码表(utf-8)转换为二进制
再将二进制转为十六进制
再在每个十六进制字节前拼接百分号,得到字符的URL编码形式
注意,只对非iso8859-1的字符进行这样的处理
![]() |
向去掉十六进制字节前的百分号
将十六进制转为二进制
再按照指定码表(utf-8)将二进制转换为字符
![]() |
正常情况下浏览器和服务器会自动进行URL编解码操作,不需要开发人员关心。
但某些开发过程中,开发人员直接操作HTTP协议相关内容(发送Cookie、设置响应头等等),需要开发人员手动编解码处理非iso8859-1数据。
![]() |
static String | encode(String s, String enc) 使用指定的编码机制将字符串转换为 application/x-www-form-urlencoded 格式。 |
![]() |
static String | decode(String s, String enc) 使用指定的编码机制对 application/x-www-form-urlencoded 字符串解码。 |
- 发送Cookie时用户名需要进行URL编码
if("true".equals(remname)){ //用户勾选了记住用户名,发送cookie保存用户名 Cookie remnamec = new Cookie("remnamec", URLEncoder.encode(username,"utf-8")); remnamec.setMaxAge(60 * 60 * 24 * 30);//保存30天 remnamec.setPath(request.getContextPath());//访问当前应用路径及其子孙路径都要带回来 response.addCookie(remnamec); } |
- 在登录页面URL解码显示用户名
<% //从Cookie中获取记住的用户名 Cookie [] cs = request.getCookies(); Cookie findC = null; if(cs!=null){ for(Cookie c : cs){ if("remnamec".equals(c.getName())){ findC = c; break; } } } String uname = ""; if(findC!=null){ String v = findC.getValue(); uname = URLDecoder.decode(v,"utf-8"); } %> <td><input type="text" name="username" value="<%=uname%>"/></td> |
Url编码注意事项
-
保留字符的编码:URL 中某些字符具有特殊含义或者不能直接在 URL 中使用,比如空格、问号、井号等。这些字符需要被正确编码以确保 URL 的有效性和可靠性。
-
编码规范:URL 编码一般使用 UTF-8 编码,这样可以涵盖广泛的字符集。确保在编码之前明确使用的字符集,以避免因编码不一致而导致的问题。
-
路径和查询参数的区别:对于 URL 中的路径部分和查询参数部分,编码的方式有所不同。路径部分的编码与整体 URL 编码相同,而查询参数中的空格、问号等应该使用特定的编码方式(比如空格用
%20
替代)。 -
特殊字符的处理:一些字符在 URL 编码时会有不同的表示方法,比如空格可以用
%20
或+
表示,根据具体的需求和标准进行选择。 -
安全字符的处理:除了保留字符外,大部分 ASCII 字符都是安全的,不需要额外编码。但为了避免混淆和提高可读性,可以对所有字符进行统一的编码处理。
-
URL 长度限制:某些环境下对 URL 长度有限制,因此应该尽量减少不必要的编码或者尝试使用更短的编码方式。