隨筆-86  評論-767  文章-3  trackbacks-3

          這兩天在繼續(xù)我的Ajax之旅。一直在抓緊步伐。

          前天試驗使用Ajax提交form表單到服務器,獲取form信息內(nèi)容出現(xiàn)了亂碼,一時無法解決。網(wǎng)上有結(jié)論說是application/x-www-form-urlencoded編碼的原因,我估計也是。正在尋找解決之道。

          大家一起討論討論。

          2005-12-05 11:20 補充:
          通過在后臺用UTF8轉(zhuǎn)碼的方式可以解決中文亂碼問題。這種方法針對form表單提交,編碼在服務器完成。代碼如下:
          form.jsp: 
          <%@ page contentType="text/html; charset=gb2312"%>
          <html>
          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
          <title>表單提交測試</title>
          <script language="javascript">
           var http_request = false;
           function send_request(url,poststr) {//初始化、指定處理函數(shù)、發(fā)送請求的函數(shù)
            http_request = false;
            //開始初始化XMLHttpRequest對象
            if(window.XMLHttpRequest) { //Mozilla 瀏覽器
             http_request = new XMLHttpRequest();
             if (http_request.overrideMimeType) {//設(shè)置MiME類別
              http_request.overrideMimeType('text/xml');
             }
            }
            else if (window.ActiveXObject) { // IE瀏覽器
             try {
              http_request = new ActiveXObject("Msxml2.XMLHTTP");
             } catch (e) {
              try {
               http_request = new ActiveXObject("Microsoft.XMLHTTP");
              } catch (e) {}
             }
            }
            if (!http_request) { // 異常,創(chuàng)建對象實例失敗
             window.alert("不能創(chuàng)建XMLHttpRequest對象實例.");
             return false;
            }
            http_request.onreadystatechange = processRequest;
            // 確定發(fā)送請求的方式和URL以及是否同步執(zhí)行下段代碼
            http_request.open("POST", url, true);
            http_request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
            http_request.send(poststr);
           }
           // 處理返回信息的函數(shù)
              function processRequest() {
                  if (http_request.readyState == 4) { // 判斷對象狀態(tài)
                      if (http_request.status == 200) { // 信息已經(jīng)成功返回,開始處理信息
                          alert(http_request.responseText);
                      } else { //頁面不正常
                          alert("您所請求的頁面有異常。");
                      }
                  }
              }
           function form_submit() {
            var f = document.form1;
            var username = f.username.value;
            var password = f.password.value;
            var poststr = "";
            if(username=="") {
             window.alert("用戶名不能為空。");
             f.username.focus();
             return false;
            }
            if(password=="") {
             window.alert("密碼不能為空。");
             f.password.focus();
             return false;
            }
            poststr = "username="+encodeURI(f.username.value)+"&password="+f.password.value;
            send_request('form_handle.jsp',poststr);
            return false;
           }
          </script>
          </head>

          <body>
          <form name="form1" method="post" action="" onsubmit="return form_submit()">
              <table width="300" border="0" cellspacing="4" cellpadding="0" style=" font-size:12pt;">
                  <tr>
                      <td width="74" height="25">用戶名:</td>
                      <td width="220" height="25"><input name="username" type="text" id="username" size="20"></td>
                  </tr>
                  <tr>
                      <td height="25">密碼:</td>
                      <td height="25"><input name="password" type="password" id="password" size="20"></td>
                  </tr>
                  <tr align="center">
                      <td height="25" colspan="2"><input type="submit" name="Submit" value="提交"></td>
                  </tr>
              </table>
          </form>
          </body>
          </html>

          form_handle.jsp:
          <%@ page contentType="text/html; charset=gb2312" language="java" errorPage="" %>
          <%
          String username = new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF8");
          String password = request.getParameter("password");
          System.out.println("用戶名:"+username);
          System.out.println("密碼:"+password);
          out.println(username+"|"+password);
          %>

          另外,有些網(wǎng)友反應生成包含中文內(nèi)容的XML文檔返回到客戶端也會出現(xiàn)亂碼問題。建議將XML文檔的編碼方式改成UTF8試試看。

          期待大家的反饋。

          posted on 2005-12-05 10:50 eamoi 閱讀(19652) 評論(28)  編輯  收藏 所屬分類: AJAX

          評論:
          # re: Ajax開發(fā)過程中提交獲取數(shù)據(jù)的亂碼問題 2005-12-06 17:53 | emu
          老問題了,最簡單的方法是,全部escape后發(fā)送。取回后unescape,絕對沒有編碼問題。如果需要在服務器端escape/unescape可以看看
          http://www.aygfsteel.com/emu/articles/4773.html
          這個帖子的初衷就是為了解決xml的問題的。上次google東亞大賽還考了一道類似的題目,我直接從這上面copy的代碼交上去的呵呵。如果用其他后臺語言就要自己寫了。

          如果后臺用GBK編碼而前臺用UTF-8的話,可以在直接后臺轉(zhuǎn)碼,如果要在前臺轉(zhuǎn)碼就要用到vbscript了:
          <SCRIPT LANGUAGE="vbScript">
          <!--
          Function URLEncoding(vstrIn)
          strReturn = ""
          For i = 1 To Len(vstrIn)
          ThisChr = Mid(vStrIn,i,1)
          If Abs(Asc(ThisChr)) < &HFF Then
          strReturn = strReturn & ThisChr
          Else
          innerCode = Asc(ThisChr)
          If innerCode < 0 Then
          innerCode = innerCode + &H10000
          End If
          Hight8 = (innerCode And &HFF00)\ &HFF
          Low8 = innerCode And &HFF
          strReturn = strReturn & "%" & Hex(Hight8) & "%" & Hex(Low8)
          End If
          Next
          URLEncoding = strReturn
          End Function
          //-->
          </SCRIPT>

          這樣編碼后發(fā)送出去,后臺就可以按gbk編碼來接收了。


            回復  更多評論
            
          # re: Ajax開發(fā)過程中提交獲取數(shù)據(jù)的亂碼問題 2005-12-13 20:20 | 郭興華
          你好:我來咨詢你個問題:
          我想作個學生信息管理系統(tǒng)吧!!
          在網(wǎng)頁上,姓名錄入時,我想出現(xiàn)"google suggest"的效果,即錄入"張",馬上下面可以出現(xiàn)一個"層",將其姓所有姓"張"的顯示出.
          這其中的主要功能我已實現(xiàn).主要用了以下幾方面知識:
          1 ajax不提交網(wǎng)頁,可以更新數(shù)據(jù).使用httprequest.open("GET","***.xml",true)
          2 通過返回xml文檔,然后使用getElementsByTagName解析xml文檔.

          但是我現(xiàn)在的問題是,我的服務器端所有學生信息都存放在*.mdb中(并且我打算使用mdb,因為我覺的我比較順手),我想根據(jù)客戶端姓名文本框中錄入的姓,向服務器端發(fā)送請求.可以實現(xiàn):
          1 使用post發(fā)送請求,.open("POST",****?姓,true)
          2 服務器可以根據(jù)"姓",從服務器的mdb數(shù)據(jù)庫中查出所有姓"張"的來
          3 將所有"姓張"的姓名生成形如<name>張三</name>....的xml文檔


          請問:
          1 服務器端怎么樣可以生成xmldoc文檔,然后transform(xmldoc)傳給客戶端. 客戶端可以使用httpresponse.responseXML返回數(shù)據(jù),再利用getElementByTagName來解析.
          2 你能告訴我服務器端程序代如何寫嗎??
          3 你能告訴我服務器端使用的什么技術(shù)嗎??還需要java2.0? tomcat?servlet??
          3 我的機器是winxp IIS ,我的機器還需要安裝什么呢???

          期待老師的指教!!!!




            回復  更多評論
            
          # re: Ajax開發(fā)過程中提交獲取數(shù)據(jù)的亂碼問題 2005-12-14 09:28 | eamoi
          回答如下:
          1、服務器端返回XML:
          使用post發(fā)送請求,.open("POST",****?姓,true) 是可行的辦法。open的URL地址可以是各種各樣的后臺程序,比如ASP、JSP等。URL地址格式為**.asp?姓=..。只是在open所指向的后臺程序文件中,要輸出xml文檔。比如,ASP中,采用Response.write方式打印出一個XML文檔;JSP中采用out.pringln的方式打印出一個XML文檔。AJAX會自動返回。返回到客戶端,用JS操縱DOM更新頁面內(nèi)容就可以了。這個過程跟數(shù)據(jù)庫類型無關(guān),無非是一個取出數(shù)據(jù)的過程而已。

          2、服務器端代碼如何寫:
          根據(jù)你所使用的技術(shù),到GOOGLE搜索一下,關(guān)鍵詞“** 生成XML文檔”。比如:“JSP 生成XML文檔”。應該可以查找到生成XML文檔的方法。這點我不贅述了。

          3、服務器端需要什么技術(shù):
          Ajax只是一個改善視圖層和提高數(shù)據(jù)交互效率的方法而已,理論上適用幾乎全部的后臺程序,至少目前已經(jīng)支持JSP/ASP/.NET/CGI等,我想編程對你應該不是問題。

          4、具備IIS的機器還需要安裝什么:
          適用IIS服務器,后臺程序應該是采用ASP或者.NET技術(shù)吧。Ajax是一個無需插件的技術(shù),它只是將目前幾種技術(shù)Javascript、XML和XSTL、DOM、XMLHttpRequest綜合起來使用,這些技術(shù)都得到了主流Web服務器和瀏覽器的支持,毋庸擔心。所以結(jié)論是:不用再安裝其他的軟件或者插件了。

          最后,祝順利。  回復  更多評論
            
          # re: Ajax開發(fā)過程中提交獲取數(shù)據(jù)的亂碼問題 2005-12-14 09:32 | eamoi
          我想出現(xiàn)"google suggest"的效果,即錄入"張",馬上下面可以出現(xiàn)一個"層",將其姓所有姓"張"的顯示出.
          ~~~~~~~~~~~~~這個應該就是數(shù)據(jù)自動匹配功能。實現(xiàn)起來難度應該不大。在幾個主流的Ajax框建中已經(jīng)都可以看到這個支持了,比如Ajax JSP Tag Library。  回復  更多評論
            
          # re: Ajax開發(fā)過程中提交獲取數(shù)據(jù)的亂碼問題 2005-12-14 11:52 | 郭興華
          你好:

          你寫的最上面那個例子.我原樣復制下來form.jsp form_handle.jsp復制下來的.怎么調(diào)試出現(xiàn)"您所請求的頁面有異常"
          我的機器是winxp iis 其他沒裝.(tomcat java2sdk也沒裝)??是什么原因??  回復  更多評論
            
          # re: Ajax開發(fā)過程中提交獲取數(shù)據(jù)的亂碼問題 2005-12-14 12:16 | 郭興華
          你能到:www.javascript.com.cn論壇下的"Ajax(javascript、XMLHttpRequest、DOM......) "論壇下看一看主題為"Ajax2"的那個貼字,給回答一下嗎??
          那里面還有你的書呢!!  回復  更多評論
            
          # re: Ajax開發(fā)過程中提交獲取數(shù)據(jù)的亂碼問題 2005-12-15 21:57 | llinzzi
          回答郭興華朋友
          jsp是需要服務端運行環(huán)境的,請安裝tomcat.  回復  更多評論
            
          # re: Ajax開發(fā)過程中提交獲取數(shù)據(jù)的亂碼問題 2005-12-17 13:13 | 郭興華
          關(guān)干利用dom操作xml的問題:
          我在JBuild4.0,(tomcat5.0)已將C:\Tomcat 5.0\common\endorsed\xml-apis.jar導入,然后編寫document1.java

          package com.deitel.advjhtp1.servlets;
          import javax.xml.parsers.*;
          import javax.xml.transform.*;

          import javax.xml.parsers.DocumentBuilderFactory;
          import javax.xml.parsers.DocumentBuilder;

          import javax.xml.transform.dom.*;
          import javax.xml.parsers.*;


          public class document1 {

          public document1() {
          Document doc;
          Document doc1=DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
          DOMSource doms=new DOMSoruce(doc);
          }
          }


          編譯時出現(xiàn)如下錯誤:

          [Document doc;這句話出現(xiàn)的錯誤:]

          "document1.java": Error #: 300 : class Document not found in class com.deitel.advjhtp1.servlets.document1 at line 15, column 3

          [這句話: Document doc1=DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();出現(xiàn)的以下兩個錯誤]

          "document1.java": Error #: 300 : class Document not found in class com.deitel.advjhtp1.servlets.document1 at line 16, column 3
          "document1.java": Error #: 360 : unreported exception: javax.xml.parsers.ParserConfigurationException; must be caught or declared to be thrown at line 16, column 72

          [ DOMSource doms=new DOMSoruce(doc);這句話出現(xiàn)的以下錯誤:]

          "document1.java": Error #: 300 : class DOMSoruce not found in class com.deitel.advjhtp1.servlets.document1 at line 17, column 22


          請高手指教!!!  回復  更多評論
            
          # re: Ajax開發(fā)過程中提交獲取數(shù)據(jù)的亂碼問題 2005-12-17 14:12 | 郭興華
          import javax.xml.transform.dom.DOMSource;
          import javax.swing.text.Document;
          加上上面兩句話,就是document doc;不出錯,其他完全相同.  回復  更多評論
            
          # re: Ajax開發(fā)過程中提交獲取數(shù)據(jù)的亂碼問題 2005-12-18 13:25 | 郭興華
          package com.deitel.advjhtp1.servlets;
          import org.w3c.dom.*;
          import javax.xml.parsers.*;
          import org.xml.sax.*;

          public class WelcomeServlet2 {

          public WelcomeServlet2() {
          }
          public static void main(String[] args) {

          Document doc;
          Element root;
          DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
          factory.setValidating(true);
          try{
          DocumentBuilder builder=factory.newDocumentBuilder();
          doc=builder.newDocument();
          }catch(ParserConfigurationException pce)
          {
          pce.printStackTrace();
          }

          root=doc.createElement("result");

          }
          }

          還是提示: root=doc.createElement("result");這句話錯誤
          "WelcomeServlet2.java": Error #: 553 : variable doc might not have been initialized at line 24, column 10
          原帖來自于網(wǎng)易社區(qū):http://p5.club.163.com/viewArticleByWWW.m?boardId=java&articleId=java_107a8e37bc7341e   回復  更多評論
            
          # re: Ajax開發(fā)過程中提交獲取數(shù)據(jù)的亂碼問題 2005-12-25 08:29 | 郭興華
          利用jdbc.odbc訪問Access數(shù)據(jù)庫.mdb,怎么寫到Class.for()時,
          打上class.時,后面提示中沒有顯示for呢,請高手指教!!


          用的是Jbuilder4.0,
          我的系統(tǒng)是jbuilder4.0 我已加上了
          import java.sql.*;
          import java.lang.class.*;

          我懷疑是不是我的什么.jar沒有config jdk??
          請高手指教!!   回復  更多評論
            
          # re: Ajax開發(fā)過程中提交獲取數(shù)據(jù)的亂碼問題 2006-01-11 18:09 |
          在asp中解決亂碼問題只需要在服務器端加上<%Response.ContentType = "text/html;charset=GB2312"%>就可以了,十分簡單!  回復  更多評論
            
          # re: Ajax開發(fā)過程中提交獲取數(shù)據(jù)的亂碼問題 2006-01-17 11:17 | suyejun
          我前臺頁面用的是GBK,為什么后臺反而要用new String(req.getParameter("username").getBytes("ISO-8859-1"),"UTF-8")進行轉(zhuǎn)碼呢?我對編碼不太清楚,能不能給點指教,謝謝~
          ps:你的教程我很喜歡  回復  更多評論
            
          # re: Ajax開發(fā)過程中提交獲取數(shù)據(jù)的亂碼問題 2006-01-23 05:48 |
          解決AJAX的亂碼,可以用 escape()函數(shù)的呀。

          var url="aaa.aspx?value=" + escape(val) ;
          //我在.Net下沒有發(fā)現(xiàn)什么問題,插入數(shù)據(jù)庫里的值沒有中文亂嗎問題  回復  更多評論
            
          # re: Ajax開發(fā)過程中提交獲取數(shù)據(jù)的亂碼問題 2006-02-07 12:29 | haiter
          我也遇到"取數(shù)據(jù)的亂碼問題"
          不知怎樣解決?  回復  更多評論
            
          # re: Ajax開發(fā)過程中提交獲取數(shù)據(jù)的亂碼問題 2006-02-15 21:41 | sea135
          我在ajax的responseText接收的是亂碼

          form_handle.jsp 中
          out.println(username+"|"+password);輸出的是UTF-8的字符串
          但是:
          out.println("密碼錯誤")
          這樣在responseText接收的不會是亂碼?

            回復  更多評論
            
          # re: Ajax開發(fā)過程中提交獲取數(shù)據(jù)的亂碼問題 2006-02-15 21:50 | sea135
          我的情況還有些不同
          我之前調(diào)用了request.setRequestEncode("GBK");
          之后我在action中
          out.print("成功");
          這時在responseText接收的是亂碼!
          我試圖轉(zhuǎn)換"成功"這個字符串的編碼但是沒用

          希望各位能幫忙解答,不勝感激  回復  更多評論
            
          # re: Ajax開發(fā)過程中提交獲取數(shù)據(jù)的亂碼問題 2006-02-27 10:45 | javadolt
          我escape后傳過去的參數(shù)為NULL,不進行escape傳過去的英文正常,中午亂碼。我是用 http_request.send(data);傳送數(shù)據(jù)過去的。
          如果直接在url后面加?test=中文,這個沒問題,把ISO-8859-1轉(zhuǎn)為GBK就可以了。  回復  更多評論
            
          # re: Ajax開發(fā)過程中提交獲取數(shù)據(jù)的亂碼問題 2006-04-08 00:39 | errorfun
          用過濾器不行嗎??  回復  更多評論
            
          # re: Ajax開發(fā)過程中提交獲取數(shù)據(jù)的亂碼問題 2006-04-26 09:56 | HH
          JavaScript:
          assertEquals("%E7%9A%84", encodeURI("的"));

          Java:
          assertEquals("\u7684", "的");
          assertEquals("的", URLDecoder.decode("%B5%C4", "GB2312"));
          assertEquals("的", URLDecoder.decode("%E7%9A%84", "UTF-8"));

          參考:Java中文亂碼問題大全
            回復  更多評論
            
          # re: Ajax開發(fā)過程中提交獲取數(shù)據(jù)的亂碼問題 2006-05-18 06:56 | java中
          hh是什么意思說得詳細些好嗎?  回復  更多評論
            
          # re: Ajax開發(fā)過程中提交獲取數(shù)據(jù)的亂碼問題 2006-06-25 08:28 | betty
          @郭興華
          應該加上import org.w3c.dom.*;
          好像是。  回復  更多評論
            
          # re: Ajax開發(fā)過程中提交獲取數(shù)據(jù)的亂碼問題 2006-06-29 15:31 | luchunwei
          謝謝,這個方法不錯。  回復  更多評論
            
          # re: Ajax開發(fā)過程中提交獲取數(shù)據(jù)的亂碼問題 2006-09-05 10:26 | fdsfds
          謝謝,
          String ss=new String(request.getParameter("value").getBytes("ISO-8859-1"),"UTF8");
          System.err.println(ss);
          我正頭大找這個解決問題呢。太謝謝了
          但在servlet中好像:request.setCharacterEncoding("UTF8");
          String ss=request.getParameter("value");
          System.err.println("post pd : "+ss);
          就行了。  回復  更多評論
            
          # re: Ajax開發(fā)過程中提交獲取數(shù)據(jù)的亂碼問題 2006-09-06 15:32 | 烏鴉在黑夜里飛
          實際上所有的問題都來自編碼的不統(tǒng)一:
          1、HTTP/POST方式在缺省情況下,采用的是“x-www-form-urlencoded”進行編碼,它和JavaScript里面的encodeURI所起的作用是一樣的;
          2、經(jīng)過這樣編碼的內(nèi)容,到達后臺時,其中的字符都是UTF-8編碼格式的;
          3、如果你的Servlet/JSP指定輸出使用的Content-Type是UTF-8,恭喜你,你不需要對這些Parameters進行特別的編碼、解碼操作,它一定是正常的;
          4、否則你需要對這些parameter進行解、編碼操作,例如你的頁面是GBK編碼,那么你需要這么寫:
          String sPara = new String(request.getParamter("test").getBytes("iso-8859-1"),"GBK");
          采用gb2312編碼的也可以采用GBK編碼;
          5、如果你是在eclipse中進行工作,請注意你的Servlet和JSP文件的屬性,其中的編碼必須和content-type中設(shè)置的一樣,否則javac會對你的文件進行錯誤的編碼,這時候的字節(jié)碼文件本身的字符串就是錯誤的,輸出也不頂用;
          6、最后做一個總結(jié):
          6.1、servlet/JSP文件本身的編碼必須和content-type輸出的一致,否則需要加入額外的編碼、解碼步驟;
          6.2、HTTP/POST方式和encodeURI方式傳入的編碼都是UTF-8的;
          6.3、普通的window.open(...),也就是HTTP/GET方式,其傳入的編碼是和運行script的頁面編碼一致的;
          6.4、后臺解碼必須通過iso-8859-1進行解碼,再使用你的目標編碼進行編碼;
          6.5、所有的問題基本上可以得到解決。  回復  更多評論
            
          # re: Ajax開發(fā)過程中提交獲取數(shù)據(jù)的亂碼問題 2007-05-31 14:40 | itblog
          我想問一下eamoi老師,這個問題最后的解決辦法,因為我現(xiàn)在遇到了同樣的問題!謝謝!  回復  更多評論
            
          # re: Ajax開發(fā)過程中提交獲取數(shù)據(jù)的亂碼問題 2007-06-11 10:57 | purple.calm
          do jsp have convert methods? just like in php mb_convert_encoding()  回復  更多評論
            
          # re: Ajax開發(fā)過程中提交獲取數(shù)據(jù)的亂碼問題 2007-06-12 15:22 | 風的語言
          我用ajax取到的文本框值提交到后臺后,文本框中的格式全沒了,只提交了純數(shù)據(jù)過去,也就是說回車換行這些都沒有了,有遇到過相同問題的嗎,請問怎么解決  回復  更多評論
            
          主站蜘蛛池模板: 年辖:市辖区| 沙洋县| 临西县| 孝昌县| 衡南县| 察哈| 库车县| 阿拉尔市| 扶绥县| 永新县| 乌拉特后旗| 凤庆县| 方山县| 五大连池市| 福海县| 甘泉县| 屯留县| 肇东市| 辽阳县| 平陆县| 新营市| 县级市| 晴隆县| 电白县| 利津县| 西藏| 洪雅县| 治县。| 甘南县| 会泽县| 郎溪县| 拜城县| 寿宁县| 天峻县| 三门县| 甘谷县| 柳林县| 遂昌县| 龙山县| 石渠县| 香格里拉县|