Web开发中编码学习总结

一、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
当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开发中看起来很容易,但是开发中真的遇到了的时候,真要仔细的发大量时间解决,不如将一些细节重视起来,出现问题时也可直接定位并顺利解决,学习的过程记录和总结,不断的进步!  



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值