﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Ordinary hut-随笔分类-ajax</title><link>http://www.blogjava.net/landor2004/category/38879.html</link><description>人间一福地，胜似天仙宫</description><language>zh-cn</language><lastBuildDate>Wed, 02 Mar 2011 21:38:01 GMT</lastBuildDate><pubDate>Wed, 02 Mar 2011 21:38:01 GMT</pubDate><ttl>60</ttl><item><title>关于web开发过程中的编码</title><link>http://www.blogjava.net/landor2004/archive/2011/03/02/345489.html</link><dc:creator>landor</dc:creator><author>landor</author><pubDate>Wed, 02 Mar 2011 07:51:00 GMT</pubDate><guid>http://www.blogjava.net/landor2004/archive/2011/03/02/345489.html</guid><wfw:comment>http://www.blogjava.net/landor2004/comments/345489.html</wfw:comment><comments>http://www.blogjava.net/landor2004/archive/2011/03/02/345489.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/landor2004/comments/commentRss/345489.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/landor2004/services/trackbacks/345489.html</trackback:ping><description><![CDATA[1 浏览器会根据content="text/html; charset=gbk"来解析该用什么编码来把这些字节流decode成字符串，并显示；<br />
2 当客户端提交表单的时候，比如以post方式提交，浏览器同样会根据上面的编码，把这些字符串encode成字节流，发送到服务端；<br />
3 在服务端，默认就会认为传过来的东西就是ASCii码，没别的，也就是ISO-8859-1，所以它就去decode，ISO-8859-1中根本没有中文汉字对应的二进制码，没找到，就乱了应该是一堆口吧；<br />
4 解决办法是加一个过滤器，比如gbk，那就设置成request.setCharacterEncoding("GBK")；这样服务端在获取字符串的时候，就用GBK去decode这个二进制流了；<br />
5 如果是ajax，问题又来了，因为ajax只支持utf-8编码格式，过程应该是这样：<br />
&nbsp;&nbsp; &nbsp;a 浏览器通过ajax像server端post数据时，ajax自动将浏览器中的文字用utf-8 encode成二进制流，然后发送到server端；<br />
&nbsp;&nbsp; &nbsp;b server端如果配置的filter是gbk，那么会用gbk去decode这个二进制流，显然乱麻；但是不应该是一堆口，因为他应该根据二进制流的每两位字节，在GBK编码表中能找到对应的内容，具体的内容是简体文字还是繁体文字还是其他的，就不一定了；<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;此时要是偶数个汉字还好（可以把它用gbk进行encode，然后用utf-8进行decode，这样就还原回来了），<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;如果是奇数个汉字就出现丢失了（因为一个字符用UTF-8 encode后为3个字节，如果三个字符被encode之后，就是9个字节，当用gbk进行decode 的时候，gbk是用2个字节，结果剩下了一个字节，这个字节在gbk的编码表中不存在（因为gbk编码表都是2个字节的），所以就用？号填充了）。<br />
&nbsp;&nbsp; &nbsp;c 所以必须在服务端的fiter中对ajax请求进行判断，用jquery为例：<br />
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">$.ajax({<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;contentType:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">application/x-www-form-urlencoded;charset=utf-8</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,</span></div>
<br />
在server端的filter中，可以判断charset是不是空，如果加上上面的代码，那么charset就是utf-8，代码如下：<br />
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->if (request.getCharacterEncoding() == null) {<br />
&nbsp;&nbsp;&nbsp; request.setCharacterEncoding(this.encoding);//正常提交请求时候，charset是空的，也就是说request.getCharacterEncoding()是空的；<br />
}</div>
<img src ="http://www.blogjava.net/landor2004/aggbug/345489.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/landor2004/" target="_blank">landor</a> 2011-03-02 15:51 <a href="http://www.blogjava.net/landor2004/archive/2011/03/02/345489.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>