百分比编码 是一种拥有8位字符编码的编码机制,这些编码在URL的上下文中具有特定的含义。它有时被称为URL编码。编码由英文字母替换组成:“%” 后跟替换字符的ASCII的十六进制表示。
需要编码的场见特殊字符有:
特殊字符 | 百分比编码 |
---|---|
: | %3A |
/ | %2F |
? | %3F |
@ | %40 |
$ | %24 |
& | %26 |
= | %3D |
% | %25 |
更多可参考:https://developer.mozilla.org/zh-CN/docs/Glossary/percent-encoding
2,字符实体(character entities)
如果希望正确地显示HTML中的预留字符,我们必须在 HTML 源代码中使用字符实进行替换。HTML 中有用的字符实体:
显示结果 | 描述 | 实体名称 | 实体编号 |
---|---|---|---|
空格 | |
  |
|
< | 小于号 | < |
< |
> | 大于号 | > |
> ; |
& | 和号 | & |
& |
" | 引号 | " |
" |
‘ | 撇号 | ' |
(IE不支持) '
|
¥ | 元(yen) | ¥ |
¥ |
? | 版权(copyright) | © |
© |
? | 注册商标 | ® |
® |
? | 商标 | ™ |
™ |
× | 乘号 | × |
× |
÷ | 除号 | ÷ |
÷ |
更多可参考:https://www.w3school.com.cn/tags/html_ref_entities.html
3,URL中出现字符实体的情况
由上面列出的字符可知,其实有很多特殊字符既有百分比编码,也有对应的字符实体,那么我们来考虑以下的场景。
在HTML源文档中存在一个URL链接,该URL中又存在"&"字符,那么如何能正确地编码"&"字符为%26或& 呢?
- 如果该URL链接只是为了在页面中呈现,那么把它当做纯粹的HTML中的内容即可,如此一来就应该对链接内容按照实体字符规则替换;
- 如果该URL连接放在<a>标签中进行跳转,那么为了确保能正确的对URL地址进行解析,则需要对其内容按照百分比编码格式进行编码;
例如,如果我们使用以下代码对html文件进行处理:
String htmlContext = "<body>http://localhost/path?age=123&name=ddd</body>" ;
String html = org.apache.commons.lang.StringEscapeUtils.escapeHtml(htmlContext) ;
那么最终输出的html内容为
<body>http://localhost/path?age=123&name=ddd</body>
可见,其url中的"&"字符被“&
”所替换,可这很可能不是我们想要的。我们希望的应该是对"&"进行百分比编码变成"%26"
如果我们使用
String html = java.net.URLEncoder.encode(htmlContext,"UTF-8")
那么最终输出的html内容为
%3Cbody%3Ehttp%3A%2F%2Flocalhost%2Fpath%3Fage%3D123%26name%3Dddd%3C%2Fbody%3E
当然,正确的做法应该是将超链接的URL使用百分比编码后插入HTML文档中,然后再对HTML文档进行字符实体替换