JAVA/JS中中文编码转换

来源:互联网 发布:mac调整照片文件大小 编辑:程序博客网 时间:2024/05/21 21:38

一、JAVA中,使用UTF-8进行编码 和 使用UTF-8的UrlEncode编码结果不同

UTF-8“君山”:君山

UTF-8/UrlEncode“君山”:%e5%90%9b%e5%b1%b1

String s = "君山";String xmlUTF8 = URLEncoder.encode(s, "UTF-8");//%e5%90%9b%e5%b1%b1

二、JS中,使用函数对URL编码

encodeURI()/decodeURI():将URL中除特殊字符外全部进行UTF-8编码/解码

var a = encodeURI("Http://localhost:8080/abc/def/efg/君山&q=1;10+a'b,cd#df");var b = decodeURI(a);

三、JS中,使用函数对URL编码

encodeURIComponent()/decodeURIComponent():将URL中除特殊字符外全部进行UTF-8编码/解码,比encodeURI更加彻底字符更多。

var a = encodeURIComponent("Http://localhost:8080/abc/def/efg/君山&q=1;10+a'b,cd#df");var b = decodeURIComponent(a);


四、URL的编解码

URL的组成部分:

http://localhost:8080/examples/servlets/servlet/君山?author=君山

       PathInfo?QueryString

默认情况下,浏览器对PathInfo和QueryString编码不同(分别是UTF-8和GBk),这为服务器解码带来不小困难。

通过tomcat源码,得知对URL的URI部分进行解码的字符集是在server.xml中<Connector URIEncoding="UTF-8">中定义的,如果没有定义,默认为ISO-8859-1,所以当URI中有中文时(其中君山为PathInfo),设置一下tomcat会自动以UTF-8的形式对URI进行解码,即可通过中文RequestMapping定位Controller中的方法了。

<Connector port="8080" protocol="HTTP/1.1"               connectionTimeout="20000"               redirectPort="8443"               URIEncoding="UTF-8" />
以GET方式HTTP请求的QueryString和与以POST方式HTTP请求的表单参数都是作为Parameters保存的,都通过request.getParameter获取参数值,对它们的解码是在request.getParameter方法第一次调用时进行的。

QueryString本身是通过Http的Header传到服务端的,而解码字符集是Header中ContentType定义的Charset(默认IOS-8859-1),要使用ContentType中定义的编码,就要将<Connector useBodyEncodingForURI="true">,注意:它并不是对整个URI都采用BodyEncoding进行解码,而仅仅是对QueryString使用BodyEncoding解码。这时就可以传递中文参数了。

<Connector port="8080" protocol="HTTP/1.1"               connectionTimeout="20000"               redirectPort="8443"               URIEncoding="UTF-8"               useBodyEncodingForURI="true" /> <!-- 仅仅是QueryString使用BodyEncoding解码 -->
最后,可以看出URL编解码比较复杂,难以掌控,建议URL中最好不用中文。
五、POST表单的编解码

POST表单的参数传递方式:Http的Body

QueryString参数传递方式:Http的Header

表单提交时用ContentTyep的Charset编码,到服务端也是用ContentType的Chartset解码,所以一般POST表单不会出现乱码。

六、BODY的编解码

通过


String ce = request.getCharacterEncoding(); //获取服务器解码方式,

request.getrequest.setCharacterEncoding("UTF-8");//设置服务器解码方式,

0 0
原创粉丝点击