Web开发中编码学习总结

来源:互联网 发布:python3源码剖析 pdf 编辑:程序博客网 时间:2024/05/22 11:37

一、web开发中涉及的编码

       在web开发中经常涉及到使用中文,不管是url带中文或者是携带中文参数过程中都涉及到编码,只要有I/O的地方都会涉及编码,而I/O引起的乱码都是网络I/O,几乎所有的应用都涉及到网络操作,而数据经过网络传输都是以自节为单位的,所以数据都得序列化为字节。
        用户从浏览器发起一次http请求,需要存在编码的地方是URL、Cookie、Parameter,服务器端接收Http协议后要解析Http协议,其中URL、Cookie、POST表单需要解码,服务器处理请求的数据后,需要将处理结果通过Socket发送到请求的浏览器中,再根据浏览器解码成文本。



二、URL的编解码

        在google中搜索java编程思想,url中会变成 java%E7%BC%96%E7%A8%8B%E6%80%9D%E6%83%B3
https://www.google.com.hk/#newwindow=1&q=java%E7%BC%96%E7%A8%8B%E6%80%9D%E6%83%B3&safe=strict
当URL地址包含非西欧字符的字符串时,系统会将非西欧字符转换成如上图的特殊字符,
         编程思想
%E7%BC%96%E7%A8%8B%E6%80%9D%E6%83%B3
转换方法是每个中文字符占2个字节,每个字节转换为2个十六进制的数字,每个中文字符转换成“XX%XX%”,采用的字符集不同
每个中文字符对应的字节数也不同。
         tomcat总对URL的URI部分惊醒解码的字符集是在connector中<Connector URIEncoding="UTF-8"/>中定义的,如果没有定义,则按ISO-8859-1解析,有中文时最好设置为UTF-8编码。
          对Get请求中参数是中文字符时,解码字符集要么是Header的ContentType中定义的Chatset要么是默认得ISO-98859-1,要使用Header中定义的Content-Type,就要将<Connector URIEncoding="UTF-8" useBodyEncodingForURI="true"/>中的useBodyEncodingForURI设置为true。
          
Content-Type:
text/html;charset=utf-8

三、POST表单的编解码

           当我们单机提交按钮时浏览器根据ContentType的Charset对表单参数进行编码,然后提交到服务器端,在服务器端根据ContentType进行解码,通过POST表单提交参数一般不会出现问题,字符集编码是我们自己设置的,通过request.setCharacterEncoding("utf-8")进行设置,第一次调用request.getParameter时就设置编码。
           返回的结果BODY的编码,先经过编码再到浏览器进行解码,可以通过response.setCharsetEncoding设置,通过Header的Content—Type返回给浏览器,如果没有设置Header的Content-Type的Charset,则根据HTML的<meta http-equiv="Content-type" content="text/html;"charset=utf-8" />charset解码,没设置则根据默认解码。
           曾经遇到这样一个问题,返回结果通过servlet直接显示在页面是乱码,但是response也设置了编码,但是PrintWriter out=response.getWriter();out.println("<html>"+str+"</html>");浏览器显示的始终是乱码,后来发现response.setCharacterEncoding("utf-8")写在response.getWriter后面,导致获取的PrintWriter的编码是默认的编码,后来写到前面就可以正常显示了,问题解决了。  

 四、js的编码          

           通过js发起的异步调用URL默认是受浏览器影响,IE是操作系统编码,firefox则是utf-8,js中主要是encodeURI和decodURI解决编解码的问题,
           js对URI进行编码,传到服务器后台如何进行解码呢?java端处理URL编解码有两个类java.net.URLEncoder和java.net.URLDecoder,如果前端使用encoder编码,后台使用URLDecoder解码则会出现乱码,两个字符集编码不一致导致的,js默认是utf-8编码,而服务端中文解码默认是GBK或GB2312,
       所以encodeURI编码后是utf-8,而java用GBK解码肯定不对,解决方法是encodeURI(encodeURI(url))进行两次编码,java端通过request.getParameter() 用GBK解码取得就是utf-8编码的字符串,在用utf-8解码一次,new   String((String)request.getParameter().getBytes(),"utf-8") ,则可直接使用了,                                               

     小结:编码问题在web开发中看起来很容易,但是开发中真的遇到了的时候,真要仔细的发大量时间解决,不如将一些细节重视起来,出现问题时也可直接定位并顺利解决,学习的过程记录和总结,不断的进步!  



0 0
原创粉丝点击