关于使用XMLHttpRequest提交和收到汉字时的乱码问题

这个问题可以在google上搜到很多答案,不过由于本人愚钝凡是以“XMLHttpRequest 乱码”搜到的文章,没有一个能圆满解决我的问题,不过从中受到不少启发,并最终帮我解决了问题.
客户端
    使用XMLHttpRequest发送和接收数据
服务器
    使用Java写servlet程序处理,并返回数据
问题:遇到汉字时出现乱码
解决:
    1. 客户端 ---> 服务器
       首先客户端发送数据前要先编码
       escape(escape('数据'));
       注意一定要两次escape;
       服务器收到的数据要解码,注意只需解码一次
       下面是从网山搜到的解码函数:
       public static String unescape(String src)
       {
        StringBuffer tmp = new StringBuffer();
        tmp.ensureCapacity(src.length());
        int lastPos = 0, pos = 0;
        char ch;
        while (lastPos < src.length()) {
            pos = src.indexOf("%", lastPos);
            if(pos == lastPos)  {
                if(src.charAt(pos + 1) == 'u') {
                    ch = (char)Integer.parseInt(src.substring(pos + 2, pos + 6), 16);
                    tmp.append(ch);
                    lastPos = pos + 6;
                }
                else{
                    ch = (char)Integer.parseInt(src.substring(pos + 1, pos + 3), 16);
                    tmp.append(ch);
                    lastPos = pos + 3;
                }
            }
            else{
                if(pos == -1){
                    tmp.append(src.substring(lastPos));
                    lastPos = src.length();
                }
                else{
                    tmp.append(src.substring(lastPos, pos));
                    lastPos = pos;
                }
            }
        }
        return tmp.toString();
    }
    2. 服务器 ---> 客户端
       服务器返回的数据要编码,下面是从网上搜到的编码函数,注意,一次编码即可
       public static String escape(String src)
 {
        int i;
        char j;
        StringBuffer tmp = new StringBuffer();
        tmp.ensureCapacity(src.length() * 6);
        for (i = 0; i < src.length(); i ++)
        {
            j = src.charAt(i);
            if(Character.isDigit(j) || Character.isLowerCase(j) || Character.isUpperCase(j))
                tmp.append(j);
            else
                if(j < 256)
                {
                    tmp.append("%");
                    if(j < 16)
                        tmp.append("0");
                    tmp.append(Integer.toString(j, 16));
               
                else
                {
                    tmp.append("%u");
                    tmp.append(Integer.toString(j, 16));
                }
        }
        return tmp.toString();
    }
    客户端收到收据要解码
    xml = XMLHttpRequest.responseText;
    xml = unescape(xml);
    解码一次即可。
---------------------------------------------
另外一种方法是使用URL编码/解码,但是不如这个方便,对于我的项目来说需要写更多的代码,所以就用这个了。
posted on 2008-08-11 10:28  dotjava  阅读(541)  评论(0)    收藏  举报