encodeURI、encodeURIComponent以及中⽂乱码问题关于前端:
encodeURIComponent(), 对⽂本框的输⼊值进⾏编码,特殊字符编码结果是%加上这些符号的ASCII码⼗六进制对照表。
encodeURI() 将整个url编码,但不会对如下字符进⾏编码 @#$&=.:/;?+ ,这些符号的基本上就是http URL中的特殊符号,是不进⾏编码的。
@
#⽹页中的⼀个位置
:/.?=&⼤多数URL基本都包含了的符号 ?a=b&c=d
;
+
url编码和utf8区别$
两种⽅式的关系及区别:
⼀些常⽤的编码结果: (底⾊部分是encodeURL不编码的字符)
原
encodeURIComponent encodeURI
值
%%25%25
空
%20%20
格
&%26&
=%3D=
/%2F/
@%40@
;%3B;
$%24$
:%3A:
+%2B+
%3F?
#%23#
中
%E4%B8%AD%E6%96%87%E4%B8%AD%E6%96%87
⽂
关于后端:
前端传值有2种⽅式,GET和POST。
⼀ 、POST⽅式传值中⽂不会产⽣乱码问题
1. JSP 页⾯有pageEncoding="UTF-8",进⾏编码设置;
2. l中的 filter 会进⾏字符编码设置,进⾏request.setCharacterEncoding("utf-8")操作。
⼆、GET⽅式
1. 乱码的产⽣和解决
⼤多数的中⽂乱码是通过GET⽅式产⽣的,只因GET⽅式有⾃动解码操作。相当于执⾏代码:
URLDecoder.decode("%E6%B1%89%E5%AD%97", "编码⽅式")
tomcat的配置⽂件l中,如果不配置解码⽅式,就会按照默认的ISO-8859-1编码进⾏解码。具体参照tomcat的⽂档。
URIEncoding:This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL.
If not specified, ISO-8859-1 will be used.
即服务端就会默认执⾏ URLDecoder.decode("%E6%B1%89%E5%AD%97", "ISO-8859-1"),即UTF-8编码,ISO解码,就会出现乱码。其中,%E6%B1%89%E5%AD%97 是前端 encodeURI("汉字") 的结果,此函数使⽤UTF-8编码。
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" />
所以,应该在这⾥增加 URIEncoding="UTF-8" 的配置,避免乱码。
2.乱码时的问号?
前端处理汉字时⽤的encodeURI是按照UTF-8⽅式进⾏编码,⽽此种编码⽅式是⼀个汉字占3字节。
⽽通过request取到的参数默认是通过ISO-8859-1的⽅式进⾏解码,到就显⽰?了,并且是3倍于汉字的个数。
3.通过两次 encodeURI 也可以解决乱码问题
a . 将“汉字”通过encodeURI或者 encodeURIComponent 编码⼀次,会得到字符串 %E6%B1%89%E5%AD%97(6字节),此字符串使⽤UTF-8编码的,如果此时⽤ISO-8859-1解码,在ISO-8859-1的编码表中不到“E6”等字段对应的字符,所以是6个问号。
b . 第⼆次编码时,相当于对⾮中⽂字符 %E6%B1%89%E5%AD%97 进⾏编码,此时服务端⽆论⽤哪种解码⽅式,都将得到
%E6%B1%89%E5%AD%97 字符,可以正确还原 。
c . 这样,再通过UTF-8 解码该字符,就可以得到“汉字”了。
即执⾏ URLDecoder.decode("%E6%B1%89%E5%AD%97", "UTF-8") ⽅法。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论