说说编码与转义的区别

编码与转义有时容易混淆,但其实是不同的。

编码

编码的英文叫encode(解码叫decode),如 URL编码、Base64编码等。

URL编码
URL编码一般用于HTTP请求中,因为一般来说URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。
因此如果需要在URL中添加特殊字符,浏览器就会对其按一定规则进行编码(即所谓的URL编码),然后再进行网络传输。
需要知道,不同的操作系统、不同的浏览器、不同的网页字符集,其URL编码的处理细节是不同的,会导致不同的编码结果。
为了避免不同客户端或平台导致的不同,可以在发起HTTP请求前,先使用 Javascript 对URL编码,然后再向服务器提交,不要给浏览器插手的机会。
因为Javascript的输出总是一致的,所以就保证了服务器得到的数据是格式统一的。
具体可以参考阮一峰的这篇文章《关于URL编码》。
Java中用于URL编解码的类有java.net包中的URLEncoderURLDecoder

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为字母串),优点是易于理解与记忆,缺点是浏览器支持不太好。如空格的实体名称是&nbsp;,>的实体名称是&lt;
实体编号的形式为&#num;(其中num为十进制数字),优点是浏览器的支持好,但是不太容易记忆。如空格的实体编号是&#160;,>的实体名称是&#62;

浏览器显示信息时

  • 如果字符被HTML escaped过,则浏览器能转换并显示成正确的字符,即将&gt;显示成>
  • 如果字符未被HTML escaped过,则浏览器遇到特殊符号时,会将其当成HTML或JS代码执行,如遇到<xxx>开头的字符串,这可能会造成xss漏洞。

后端XML引擎在处理时
带有<、>等符号的字符串,在后端被xml引擎处理时,可能会将其当成 xml 代码执行,因此对于前端输入的文本,需要做escape处理。

Java中用于转义处理的类有Apache commons-lang 包中的StringEscapeUtils、spring-web 包中的HtmlUtilsJavaScriptUtils等。

posted @ 2021-03-17 19:20  i江湖中人  阅读(994)  评论(0编辑  收藏  举报