AJAX返回中文的问题(在线等)急!!!
<P><FONT color=#ff0000>这个是自动完成的代码,但是查中文的时候返回的是乱码!<br><br>这是JSP页面。在这里调用的SERVLET返回来的就是乱码<br></FONT><br><%@ page contentType="text/html; charset=UTF-8" %><br><html><br> <head><br> <meta HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8"><br> <title>Ajax Auto Complete</title><br> <style type="text/css"></P><P> .mouseOut {<br> background: #708090;<br> color: #FFFAFA;<br> }</P>
<P> .mouseOver {<br> background: #FFFAFA;<br> color: #000000;<br> }<br> </style><br> <script type="text/javascript"><br> var xmlHttp;<br> var completeDiv;<br> var inputField;<br> var nameTable;<br> var nameTableBody;</P>
<P> function createXMLHttpRequest() {<br> if (window.ActiveXObject) {<br> xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");<br> }<br> else if (window.XMLHttpRequest) {<br> xmlHttp = new XMLHttpRequest();<br> }<br> }</P>
<P> function initVars() {<br> inputField = document.getElementById("names");<br> nameTable = document.getElementById("name_table");<br> completeDiv = document.getElementById("popup");<br> nameTableBody = document.getElementById("name_table_body");<br> }</P>
<P> function findNames() {<br> initVars();<br> if (inputField.value.length > 0) {<br> createXMLHttpRequest();<br> var url = "autocompleteservlet?names=" + inputField.value;<br> xmlHttp.open("POST", url, true);<br> xmlHttp.onreadystatechange = callback;<br> xmlHttp.send(null);<br> } else {<br> clearNames();<br> }<br> }</P>
<P> function callback() {<br> if (xmlHttp.readyState == 4) {<br> if (xmlHttp.status == 200) {<br> //var name = //�����������ô��д������<br> // xmlHttp.responseXML<br> // .getElementsByTagName("name")[0].firstChild.data;<br> //setNames(xmlHttp.responseXML.getElementsByTagName("name"));<br> var name = xmlHttp.responseXML.getElementsByTagName("name");<br> setNames(name);<br> //204״̬�룬no content<br> //û�����ĵ��������Ӧ�ü�����ʾԭ4���ĵ�<br> } else if (xmlHttp.status == 204){<br> clearNames();<br> }<br> }<br> }</P>
<P> function setNames(the_names) {<br> clearNames();<br> var size = the_names.length;<br> setOffsets();</P>
<P> var row, cell, txtNode;<br> for (var i = 0; i < size&& i<10; i++) { //����10���¼��ֻ��ʾǰ10��<br> var nextNode = the_names[i].firstChild.data;<br> row = document.createElement("tr");<br> cell = document.createElement("td");</P>
<P> cell.onmouseout = function() {this.className='mouseOver';};<br> cell.onmouseover = function() {this.className='mouseOut';};<br> cell.setAttribute("bgcolor", "#FFFAFA");<br> cell.setAttribute("border", "0");<br> cell.onclick = function() { populateName(this); } ;</P>
<P> txtNode = document.createTextNode(nextNode);<br> cell.appendChild(txtNode);<br> row.appendChild(cell);<br> nameTableBody.appendChild(row);<br> }<br> }</P>
<P> function setOffsets() {<br> var end = inputField.offsetWidth;<br> var left = calculateOffsetLeft(inputField);<br> var top = calculateOffsetTop(inputField) + inputField.offsetHeight;</P>
<P> completeDiv.style.border = "black 1px solid";<br> completeDiv.style.left = left + "px";<br> completeDiv.style.top = top + "px";<br> nameTable.style.width = end + "px";<br> }</P>
<P> function calculateOffsetLeft(field) {<br> return calculateOffset(field, "offsetLeft");<br> }</P>
<P> function calculateOffsetTop(field) {<br> return calculateOffset(field, "offsetTop");<br> }</P>
<P> function calculateOffset(field, attr) {<br> var offset = 0;<br> while(field) {<br> offset += field[attr];<br> field = field.offsetParent;<br> }<br> return offset;<br> }</P>
<P> function populateName(cell) {<br> inputField.value = cell.firstChild.nodeValue;<br> clearNames();<br> }</P>
<P> function clearNames() {<br> var ind = nameTableBody.childNodes.length;<br> for (var i = ind - 1; i >= 0 ; i--) {<br> nameTableBody.removeChild(nameTableBody.childNodes[i]);<br> }<br> completeDiv.style.border = "none";<br> }</P>
<P> </script><br> </head><br> <body><br> <h1>Ajax Auto Complete Example</h1><br> Names: <input type="text" size="20" id="names"<br> onblur="findNames();" style="height:20;" /><br> <div style="position:absolute;" id="popup"><br> <table id="name_table" bgcolor="#FFFAFA" border="0"<br> cellspacing="0" cellpadding="0"/></P>
<P> <tbody id="name_table_body"></tbody><br> </div><br> </body><br></html><br><br><FONT color=#ff0000>AutoCompleteServlet是SERVLET<br></FONT>package newauto;</P>
<P>import java.io.*;<br>import java.util.ArrayList;<br>import java.util.Iterator;<br>import java.util.List;<br>import javax.servlet.*;<br>import javax.servlet.http.*;<br>import com.*;</P>
<P>public class AutoCompleteServlet extends HttpServlet {<br> private static final String CONTENT_TYPE = "text/xml; charset=GB2312";<br> private List names = new ArrayList();</P>
<P> public void init(ServletConfig config) throws ServletException {<br> names.add("Abe");<br> names.add("Abel");<br> names.add("Abigail");<br> names.add("Abner");<br> names.add("Abraham");<br> names.add("Marcus");<br> names.add("Marcy");<br> names.add("Marge");<br> names.add("Marie");<br> names.add("中国");<br> names.add("中华");<br> names.add("中哈哈");<br> }</P>
<P>protected void doGet(HttpServletRequest request, HttpServletResponse response)<br> throws ServletException, IOException {</P>
<P> request.setCharacterEncoding("UTF-8");<br>// String prefix = new String(request.getParameter("names").getBytes("ISO8859_1"),"GBK");<br> String prefix = StringUtil.getDecodeParamFromReq("names",request);<br> System.out.println(prefix);<br> NameService service = NameService.getInstance(names);<br> List matching = service.findNames(prefix);<br> if (matching.size() > 0) {<br> PrintWriter out = response.getWriter();</P>
<P> response.setContentType("text/xml;charset=UTF-8");<br> response.setContentType("text/xml;charset=UTF-8");<br> response.setHeader("Cache-Control", "no-cache");<br> response.setDateHeader("Expires",0);<br> response.setCharacterEncoding("UTF-8");</P>
<P> out.println("<response>");<br> Iterator iter = matching.iterator();<br> while(iter.hasNext()) {<br> String name = (String) iter.next();<br> out.println("<name>" + name + "</name>");<br> out.println(name+"with name");<br> }<br> out.println("</response>");<br> matching = null;<br> service = null;<br> out.close();<br> } else { //如果结果为空,设置http状态码为204<br> response.setStatus(HttpServletResponse.SC_NO_CONTENT);<br> }<br> }<br> public void doPost(HttpServletRequest request, HttpServletResponse response) throws<br> ServletException, IOException {<br> doGet(request, response);<br>}</P>
<P>//Clean up resources<br>public void destroy() {<br>}</P>
<P>}<br><br><br><FONT color=#ff0000>NameService是处理的JAVA</FONT><br>package newauto;</P>
<P><br>import java.util.ArrayList;<br>import java.util.Iterator;<br>import java.util.List;</P>
<P>public class NameService {<br> private List names;</P>
<P> /** Creates a new instance of NameService */<br> private NameService(List list_of_names) {<br> this.names = list_of_names;<br> }</P>
<P> public static NameService getInstance(List list_of_names) {<br> return new NameService(list_of_names);<br> }</P>
<P> public List findNames(String prefix) {<br> String prefix_upper = prefix.toUpperCase();<br> List matches = new ArrayList();<br> System.out.println(prefix);<br> //跟下面的一样<br> //for(int i=0;i<names.size();i++){</P>
<P> //String one_name = (String)names.get(i);</P>
<P> //String one_name_upper = one_name.toUpperCase();</P>
<P> // if(one_name_upper.startsWith(prefix_upper)){<br> //matches.add(one_name);<br> // }</P>
<P><br> Iterator iter = names.iterator();<br> while(iter.hasNext()) {<br> String name = (String) iter.next();<br> String name_upper_case = name.toUpperCase();<br> System.out.print(name +"with");<br> if(name_upper_case.startsWith(prefix_upper)){<br> boolean result = matches.add(name);<br> }<br> }<br> return matches;<br> }<br>}</P>
<P><br><br><FONT color=#ff0000>StringUtil 这是网上找的一个转字符的类,但是用了返回也是乱码<br></FONT>package newauto;</P>
<P>import javax.servlet.http.HttpServletRequest;</P>
<P>public final class StringUtil {<br> private StringUtil() {</P>
<P> }</P>
<P> public static String getDecodeParamFromReq(String paramName,<br> HttpServletRequest request) {<br> String retval = request.getParameter(paramName);</P>
<P> try {<br> // 中间用ISO-8859-1过渡<br> byte[] b = retval.getBytes("8859_1");</P>
<P> // 转换成GB2312字符<br> retval = new String(b, "GB2312");<br> } catch (Exception e) {<br> e.printStackTrace();<br> }</P>
<P> return retval;<br> }<br>}<br><br><br>谁能帮我看看呀,已经想了很多的办法还是返回乱码。<br></P>
[align=right][color=#000066][此贴子已经被作者于2007-11-4 17:21:28编辑过][/color][/align]
[align=right][color=#000066][此贴子已经被作者于2007-11-11 13:48:31编辑过][/color][/align]
<P>搞定了,在PHP中只要指定编码即可:header('Content-Type:text/html;charset=GB2312');<BR>相信在你的JSP中同样也可以关于http header的注意事项我就不说了,呵呵</P> 你可以在后台程序里设置编码:response.setContentType("text/xml;charset=UTF-8");
这个问题要说解决起来也很简单,原因是 Ajax 在接收 responseText 或 responseXML 的值的时候是按照 UTF-8 的格式来解码的,如果服务器端发送的数据不是 UTF-8 的格式,那么接收的值就会是乱码
你可以试一试,反正我这样做了,是没有问题的。
页:
[1]
