先贴源码
jsp部分:
<%@ page language="java" pageEncoding="gb2312"%> 
<%@ page contentType="text/html;charset=gb2312"%> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<script language="javascript" src="js/jquery-1.3.2.js"></script>
<script type="text/javascript">
function getcnames(){
var cnames = "";
$.ajax(
{
type: "Post",
url: "servlet/GetSiteCnameServlet",
async : false,
success: function(msg)
{
cnames = msg;
alert(msg);
}
});
document.getElementById( "filecnames" ).innerHTML = cnames;
}
</script>
</head>
<body>
<table width="800">
<h3>站点管理</h3>
<hr>
<input type="button" value="读取文件名" onclick="getcnames()">
<div id="filecnames"></div></table>
/////////////////////////////////////////////////////////////////////form这部分是做测试用的,测试证明“西点男孩”可以返回页面无乱码<form action="servlet/GetSiteCnameServlet">
<input type="text" name="xidianboy" value="西点男孩">
<input type="submit" value="提交">
</form>
/////////////////////////////////////////////////////////////////////
</body>
</html>servlet部分:
public class GetSiteCnameServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { PrintWriter out = response.getWriter();
GetCnames rcname = new GetCnames();
String cnames = rcname.getCnames();
out.println(cnames);

out.println(request.getParameter("xidianboy"));

} public GetSiteCnameServlet() {
super();
} public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
} public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response); } public void init() throws ServletException {
// Put your code here
}}
说明:
点击 "读取文件名" 按钮进入doPost方法,String cnames = rcname.getCnames(); cnames返回的是中文字符,无误!,但页面 alert(msg);的时候就显示问号,一个汉字显示一个问号(“???,????,?????,??,????,”),试过了很多字符编码的解决办法都没用。后来测试不用Ajax回调直接输出,直接:
<form action="servlet/GetSiteCnameServlet">
<input type="text" name="xidianboy" value="西点男孩">
<input type="submit" value="提交">
</form>
则能够返回“西点男孩”中文,无误!百思不得其解,往高手指点。
Ajax回调回来的乱码该如何解决?

解决方案 »

  1.   

    在异步提交前线进行转码escape,返回值在进行解码
      

  2.   

    new String("".getBytes("ISO-8859-1"),"GBK");最好的解决方法就是sf说的。先进行转码,然后提交后解码,处理完转码,展现在解码,这样一整个过程都是受控制的,
      

  3.   

    <input type="button" value="读取文件名" onclick="getcnames()">这里提交到后台
    String cnames = rcname.getCnames();
    new String(cnames.getBytes( "ISO-8859-1"), "GBK");
    out.println(cnames);这里cnames是中文,没有问题,请教sbe_steels 回调回来的“msg” 如何解码?
      

  4.   

    在<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 
    下面加上
    <%@ page contentType="text/html;charset=gb2312" %> 
    一定有, 而且要在文件首行(不能在include文件中) 。不行的话,把第一行<%@ page language="java" pageEncoding="gb2312"%> 去掉再试
      

  5.   


    // 设定为2312编码
    resp.setContentType("text/html;charset=gb2312");
      

  6.   

    我说过了,经测试如下:
    <form action="servlet/GetSiteCnameServlet"> 
    <input type="text" name="xidianboy" value="西点男孩"> 
    <input type="submit" value="提交"> 
    </form> out.println(request.getParameter("xidianboy")); 这样输出中文是没有问题的,所以可以肯定我的jsp的字符编码没有问题,那么问题在:
    $.ajax( 

    type: "Post", 
    url: "servlet/GetSiteCnameServlet", 
    async : false, 
    success: function(msg) 

    cnames = msg; 
    alert(msg); 

    }); 
    属于jquery字符编码问题,我找了资料:
    $.ajax({url: "3.jsp",type: "post",data: "method=testAjaxPost&name=中文",success: function(response){
        alert(response);
    }});
    诸如此类修改,还是没效果。