数据传递转码
【前后端数据传输不得不面对的转码问题】数据在传输的过程中,浏览器会对数据进行编码,假如我现在有一条数据 {"name": "测试"},如果我们通过 get 方法传递数据,这条数据会被拼接到 url 请求的后面,如:localhost:8080/src/text.html?name=测试 。
uri本身是采用ASCII编码的,所以如果是非 ASCII 编码集的字符在传输时都会被编码,编码方法和 encodeURI 的编码规则相同,但是这里的编码规则是由浏览器控制的,不同的浏览器采用的编码方式 (UTF-8,GBK) 不一样,被编码的数据发送给服务器,服务器用 iso-8859-1 编码对数据解码,后端人员通过 request.getParameter("name") 获取参数数据,且获得的数据都是经过解码过的,而解码过程中程序里无法指定,对于 get 请求获得的数据 request.setCharacterEncoding("字符集") 指定解码规则无效 。
如果是 post 方法传递数据,浏览器也会对数据进行编码,如果我们在 ajax 请求头里面设置了 setRequestHeader("ContentType","Application/x-www-form-urlencoded;charset=UTF-8"); 浏览器就会以charset值进行编码,如果没有设置则由网页 meta 标签的 charset 属性决定,被编码过的数据发送给服务器,服务器用 iso-8859-1 编码对数据解码,对于post请求发来的数据后端人员可以使用 request.setCharacterEncoding("字符集") 指定解码规则 。
相信你已经找出了乱码的原因,由于 get 方法传的的数据,浏览器的转码规则和服务器的解码规则不一致出现了乱码,我们一般是怎么解决的呢?get 方式发送的数据如果有中文和特殊字符前端会先使用 encodeURI() 方法转码,这样 url 里面的就都是 ASCII 编码集的字符,省去了浏览器的转码,且 encodeURI() 的转码规则可控,受网页 meta 头的 charset 属性影响,
- 标签的 charset 属性为 utf-8 时:
- 标签的 charset 属性为 GBK 时:
当我们需要传递的数据量大,结构复杂,业务场景,技术实现需要的时候我们就又会发现,乱码的问题依然存在,比如
- json格式的数据由于特殊字符导致数据解析出现问题,
- xml格式数据由于特殊字符破坏xml格式导致数据解析出现问题,
- 前后端一些语言自带的转码方法对一些特殊字符转码结果不一致,以及并非所有特殊字符都会被转码...
那么这个时候我们就该考虑有没有一种转码规则可以解决以上所有的问题呢?base64 转码你值得拥有 。
base64转码
base64 编码是从二进制到字符的过程,编码受 html 页面头部 mate;标签的 charset 属性影响,charset 属性不同,编码转为二进制时,产生的二进制也是不一样的,所以最终产生的 base64 字符也不一样 。
- mate 标签的 charset 属性为 utf-8 时: