初心者1号 发表于 2007-11-4 16:00

AJAX返回中文的问题(在线等)急!!!

<P><FONT color=#ff0000>这个是自动完成的代码,但是查中文的时候返回的是乱码!<br><br>这是JSP页面。在这里调用的SERVLET返回来的就是乱码<br></FONT><br>&lt;%@ page contentType="text/html; charset=UTF-8" %&gt;<br>&lt;html&gt;<br>  &lt;head&gt;<br>  &lt;meta HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8"&gt;<br>    &lt;title&gt;Ajax Auto Complete&lt;/title&gt;<br>    &lt;style type="text/css"&gt;</P>
<P>    .mouseOut {<br>    background: #708090;<br>    color: #FFFAFA;<br>    }</P>
<P>    .mouseOver {<br>    background: #FFFAFA;<br>    color: #000000;<br>    }<br>    &lt;/style&gt;<br>    &lt;script type="text/javascript"&gt;<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 &gt; 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 =                    //�����������&ocirc;��д������<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>                //&ucirc;�����ĵ��������Ӧ�ü�����ʾԭ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 &lt; size&amp;&amp; i&lt;10; i++) {       //����10���&frac14;��ֻ��ʾǰ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 &gt;= 0 ; i--) {<br>                 nameTableBody.removeChild(nameTableBody.childNodes[i]);<br>            }<br>            completeDiv.style.border = "none";<br>        }</P>
<P>    &lt;/script&gt;<br>  &lt;/head&gt;<br>  &lt;body&gt;<br>    &lt;h1&gt;Ajax Auto Complete Example&lt;/h1&gt;<br>    Names: &lt;input type="text" size="20" id="names"<br>                                   onblur="findNames();" style="height:20;" /&gt;<br>        &lt;div style="position:absolute;" id="popup"&gt;<br>            &lt;table id="name_table" bgcolor="#FFFAFA" border="0"<br>                                            cellspacing="0" cellpadding="0"/&gt;</P>
<P>            &lt;tbody id="name_table_body"&gt;&lt;/tbody&gt;<br>    &lt;/div&gt;<br>  &lt;/body&gt;<br>&lt;/html&gt;<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() &gt; 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("&lt;response&gt;");<br>            Iterator iter = matching.iterator();<br>            while(iter.hasNext()) {<br>                String name = (String) iter.next();<br>                out.println("&lt;name&gt;" + name + "&lt;/name&gt;");<br>                out.println(name+"with name");<br>            }<br>            out.println("&lt;/response&gt;");<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&lt;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]

随缘小强 发表于 2007-11-11 13:46

呵呵,我也在为这个问题发愁呢,不过我的是PHP的日历程序,看网上说可以在PHP里使用iconv函数转换编码,但是我转换了还是不对~
[align=right][color=#000066][此贴子已经被作者于2007-11-11 13:48:31编辑过][/color][/align]

随缘小强 发表于 2007-11-12 09:09

<P>搞定了,在PHP中只要指定编码即可:header('Content-Type:text/html;charset=GB2312');<BR>相信在你的JSP中同样也可以关于http header的注意事项我就不说了,呵呵</P>

scdmike 发表于 2007-12-5 11:08

你可以在后台程序里设置编码:response.setContentType("text/xml;charset=UTF-8");

这个问题要说解决起来也很简单,原因是 Ajax 在接收 responseText 或 responseXML 的值的时候是按照 UTF-8 的格式来解码的,如果服务器端发送的数据不是 UTF-8 的格式,那么接收的值就会是乱码

你可以试一试,反正我这样做了,是没有问题的。

页: [1]

编程论坛