字符编码小结

前言: 我们知道URL只能使用英文字母、阿拉伯数字和某些标点符号,那么在网络通信中使用的URL中的中文字符就需要进行编码处理。在B/S架构的Web开发中,客户端浏览器默认的编码格式和服务器返回的编码格式可能是不一致的,这就可能导致乱码的问题,我们最好是在实际开发中前后端采用统一的编码格式。js层面上有escape()、encodeURI()、encodeURIComponent()三种编码函数,对应的解码函数为unescape()、decodeURI()、decodeURIComponent(),本文主要总结这三种编码函数的差异与应用。

 

浏览器默认编码中文内容的四种情况:

一、例如:http://www.wx45.com/test/四川绵阳 中文字符作为网址路径的一部分,浏览器设置的默认编码方式(关于utf-8详情参考本文末尾说明一)

二、http://www.wx45.com/test/test.html?wx_id=1&wx_name=测试 中文字符属于查询字符串。

实测结果发现中文字符“测试”被采用utf-8编码,网上资料说对查询字符串的编码使用的是操作系统默认编码格式。

三、表单GET、POST提交中文字符,编码方式为网页HTML头中规定的编码方式。

四、ajax GET方法提交中文字符,编码方式为网页HTML头中规定的编码方式;POST方法提交中文字符,实测结果:data: è¾“入编码原文

出现乱码情况(即没有被编码),但是post方法传参数并不是采用URL传值的方式,所以没有影响到请求的发送。

 

三种js编码函数的分析:

1、escape()函数

 功能:escape()函数对字符串进行编码,采用unicode字符编码集,在\u0000到\u00ff之间(即0-255之间)的符号采用utf-8编码格式即%xx,其余符号直接采用unicode字符编码%uxxxx的形式。

 说明:escape不编码字符有69个:*,+,-,.,/,@,_,0-9,a-z,A-Z

       escape()不对"+"编码。但是网页在提交表单的时候,如果有空格,则会被转化为+字符。服务器处理数据的时候,会把+号处理成空格。值得一提的是php编码函数urlencode()会将空格变为+号。

(关于unicode参照本文末尾说明二)

 

2、encodeURI()函数

  功能:encodeURI()函数可把字符串作为URI进行编码,返回结果为utf-8格式的unicode编码值。

 说明:encodeURI不编码字符有82个:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z

 

3、encodeURIComponent()函数

   说明:与encodeURI()函数编码的方式完全一致,不同的是encodeURI()函数用于对整个URL进行编码,会保留URL字符串可读性,所以encodeURIComponent函数会比encodeURI函数编码更多字符。

encodeURIComponent不编码字符有71个:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z

 

总结:

1、三个函数使用的字符集均是unicode,三者对于unicode编码值0-255即\u0000-\u00ff的编码结果是相同的utf-8格式(%xx)

2、escape()已经不推荐使用,但是php生成json字符串的函数json_encode()会返回中文字符的unicode编码值(\uxxxx),在前台js中将“\”替换成“%”则可使用unescape()函数解析出中文字符。

3、decodeURI与decodeURIComponent编码结果为utf-8格式,通用性更好。

 

说明一:utf-8 简单说是基于unicode编码集的一种字符编码方式,它是一种变长的编码方式。它可以使用1~4个字节表示一个符号(比如中文字符的表示需要三个字节%xx%xx%xx),根据不同的符号而变化字节长度。

UTF-8的编码规则很简单,只有两条,但是完全看不懂:

1、对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。则对于英语字母,UTF-8编码和ASCII码是相同的。

2、对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

 

说明二:unicode 简单说是一个符号集(格式:\uxxxx)为世界上所有的字符确定了唯一的四位十六进制数表示。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值