zoukankan      html  css  js  c++  java
  • 说说编码与转义的区别

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

    编码

    编码的英文叫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语言中的 、 ,以及 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等。

  • 相关阅读:
    【数学】多项式取 ln
    【数学】多项式求逆
    【模拟 + 栈】AcWing 151. 表达式计算4
    Unity3D开发入门教程(一)——搭建开发环境
    Unity3D开发入门教程(三)——添加启动脚本
    Unity3D开发入门教程(二)—— Lua入门
    Unity3D开发入门教程(四)——用Lua实现组件
    哈希表
    邻接表
    并查集
  • 原文地址:https://www.cnblogs.com/haycheng/p/14550728.html
Copyright © 2011-2022 走看看