编码的英文叫encode(解码叫decode),如 URL编码、Base64编码等。
URL编码
URL编码一般用于HTTP请求中,因为一般来说URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。
因此如果需要在URL中添加特殊字符,浏览器就会对其按一定规则进行编码(即所谓的URL编码),然后再进行网络传输。
需要知道,不同的操作系统、不同的浏览器、不同的网页字符集,其URL编码的处理细节是不同的,会导致不同的编码结果。
为了避免不同客户端或平台导致的不同,可以在发起HTTP请求前,先使用 Javascript 对URL编码,然后再向服务器提交,不要给浏览器插手的机会。
因为Javascript的输出总是一致的,所以就保证了服务器得到的数据是格式统一的。
具体可以参考阮一峰的这篇文章《
关于URL编码
》。
Java中用于URL编解码的类有java.net包中的
URLEncoder
、
URLDecoder
。
Base64编码
Base64编码是将任意一个
字节
,转换成可打印的ASCII字符。
Base64编码一个主要用途是为了表示或说打印二进制数据,如可以用一个字符串来表示一张图片的二进制数据;另一个用途是简单加密。
Base64编码先是定义好一个包含64个字符(小写字母a-z、大写字母A-Z、数字0-9、符号"+"、"/"。再加上作为垫字的"=",实际上是65个字符)的字符集,然后将任意一个值0~63之间的字节,映射到字符集中的某个字符上。
一个字节的值范围是0 ~ 255,怎样才能使其在0 ~ 63之间?Base64的做法是将3个原始数据的字节作为一组,为24 bit,再将其分成4份,每份6 bit,并为每份前面补充两位00,这样就得到了4个在0 ~ 63之间的字节,然后就可以将这4个字节映射到Base64的字符集上了。
由此可知,6 bit经过Base64编码后变成了8 bit,数据长度会增加1/3左右。
关于Base64编码更具体的细节,可以参考阮一峰的文章《
Base64笔记
》。
Java中用于Base64编解码的类有java.util包下的
Base64
类。
转义的英文叫escape(反转义叫unescape),如C语言中的\n、\t,以及 HTML、XML 中特殊符号转义成
实体
(如在HTML中将空格、>、<、&等符号,转换成对应的HTML实体,称为 HTML escape)。
实体有
实体名称
和
实体编号
两种形式,它们都是以
&
开头,以
;
结尾。
实体名称
的形式为
&str;
(其中str为字母串),优点是易于理解与记忆,缺点是浏览器支持不太好。如空格的实体名称是
,>的实体名称是
<
。
实体编号
的形式为
&#num;
(其中num为十进制数字),优点是浏览器的支持好,但是不太容易记忆。如空格的实体编号是
 
,>的实体名称是
>
。
浏览器显示信息时
:
如果字符被HTML escaped过,则浏览器能转换并显示成正确的字符,即将
>
显示成
>
;
如果字符未被HTML escaped过,则浏览器遇到特殊符号时,会将其当成HTML或JS代码执行,如遇到
<xxx>
开头的字符串,这可能会造成xss漏洞。
后端XML引擎在处理时
:
带有<、>等符号的字符串,在后端被xml引擎处理时,可能会将其当成 xml 代码执行,因此对于前端输入的文本,需要做escape处理。
Java中用于转义处理的类有Apache commons-lang 包中的
StringEscapeUtils
、spring-web 包中的
HtmlUtils
、
JavaScriptUtils
等。