论坛首页 Web前端技术论坛

AJAX POST时的中文乱码问题和解决

浏览 26851 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-12-12  
问题描述:
       我在js中建立一个数组items,如下:items=[{name:'中文'}],我把这个数组转换成字符串发往后台,后台接收数据并存入数据库:
js 代码
 
  1. Ext.Ajax.request({  
  2.         url:'',  
  3.         params:{  
  4.             items:Ext.util.JSON.encode(items)  
  5.         },  
  6.         method:"POST",  
  7.         success:function(){alert("成功")}  
  8. });  
结果这样传送的字符串不能正确的得到解析,无论在firefox下观察params的串还是后台接收的数据都是乱码。于是我改了下代码:
js 代码
 
  1. Ext.Ajax.request({  
  2.         url:'',  
  3.         params:{  
  4.             items:encode(Ext.util.JSON.encode(items))   //就是将字符串编码一下  
  5.         },  
  6.         method:"POST",  
  7.         success:function(){alert("成功")}  
  8. });  
这样,传输的字符串是以utf-8的编码方式。
然而,这样在后台接收数据并存储到数据库仍然是乱码的形式,我后台全部都是以UTF-8编码方式。
解决:
        试了好长时间,最后终于解决,方法很简单,在后台加入这样一行代码:
java 代码
 
  1. String str=req.getParameter("items");  
  2. str=java.net.URLDecoder.decode(str, "UTF-8");  
这行代码的意思是把得到的application/x-www-form-urlencoded 编码方式的字符串解码成utf-8编码方式。

请教:(虽然在网上找到很多关于乱码问题的解决办法,但大都不能针对自己的问题。)
       虽然已经解决了乱码问题,但实际上我还不是很明白在js不进行encode而直接传送为什么会是乱码,难道Ext的Ajax不是默认UTF-8编码方式?。请大家指教!!!
            
   发表时间:2007-12-13  

我的博客里有一个解决方案http://xiaocheng.iteye.com/blog/147913

解决方案是用escape函数来编码.
比如
var peoName="张三";
    peoName=escape(escape(peoName));
    //看到为什么两次用到escape函数不要奇怪.
这样提交到服务器后,我们只要用一个java方法来解码就可以了.
action中我们只要用Escape.java中的unescape静态方法就可解码。
String Name= Escape.unescape(request.getParameter("peoName")).trim();

Escape.java  代码
  1. package com.ctgusec.oaPlus;       
  2. /**     
  3.  * 将url中文参数编码或者反编码     
  4.  * javascript escape/unescape 编码的 Java 实现     
  5.  * author jackyz     
  6.  * keep this copyright info while using this method by free     
  7.  */      
  8. public class Escape{       
  9.     private final static String[] hex = {       
  10.         "00","01","02","03","04","05","06","07","08","09","0A","0B","0C","0D","0E","0F",       
  11.         "10","11","12","13","14","15","16","17","18","19","1A","1B","1C","1D","1E","1F",       
  12.         "20","21","22","23","24","25","26","27","28","29","2A","2B","2C","2D","2E","2F",       
  13.         "30","31","32","33","34","35","36","37","38","39","3A","3B","3C","3D","3E","3F",       
  14.         "40","41","42","43","44","45","46","47","48","49","4A","4B","4C","4D","4E","4F",       
  15.         "50","51","52","53","54","55","56","57","58","59","5A","5B","5C","5D","5E","5F",       
  16.         "60","61","62","63","64","65","66","67","68","69","6A","6B","6C","6D","6E","6F",       
  17.         "70","71","72","73","74","75","76","77","78","79","7A","7B","7C","7D","7E","7F",       
  18.         "80","81","82","83","84","85","86","87","88","89","8A","8B","8C","8D","8E","8F",       
  19.         "90","91","92","93","94","95","96","97","98","99","9A","9B","9C","9D","9E","9F",       
  20.         "A0","A1","A2","A3","A4","A5","A6","A7","A8","A9","AA","AB","AC","AD","AE","AF",       
  21.         "B0","B1","B2","B3","B4","B5","B6","B7","B8","B9","BA","BB","BC","BD","BE","BF",       
  22.         "C0","C1","C2","C3","C4","C5","C6","C7","C8","C9","CA","CB","CC","CD","CE","CF",       
  23.         "D0","D1","D2","D3","D4","D5","D6","D7","D8","D9","DA","DB","DC","DD","DE","DF",       
  24.         "E0","E1","E2","E3","E4","E5","E6","E7","E8","E9","EA","EB","EC","ED","EE","EF",       
  25.         "F0","F1","F2","F3","F4","F5","F6","F7","F8","F9","FA","FB","FC","FD","FE","FF"      
  26.     };       
  27.     private final static byte[] val = {       
  28.         0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,       
  29.         0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,       
  30.         0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,       
  31.         0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,       
  32.         0x3F,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,       
  33.         0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,       
  34.         0x3F,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,       
  35.         0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,       
  36.         0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,       
  37.         0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,       
  38.         0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,       
  39.         0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,       
  40.         0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,       
  41.         0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,       
  42.         0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,       
  43.         0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F      
  44.     };       
  45.     public static String escape(String s) {       
  46.         StringBuffer sbuf = new StringBuffer();       
  47.         int len = s.length();       
  48.         for (int i = 0; i < len; i++) {       
  49.             int ch = s.charAt(i);       
  50.             if (ch == ' ') {                        // space : map to '+'        
  51.                 sbuf.append('+');       
  52.             } else if ('A' <= ch && ch <= 'Z') {    // 'A'..'Z' : as it was       
  53.                 sbuf.append((char)ch);       
  54.             } else if ('a' <= ch && ch <= 'z') {    // 'a'..'z' : as it was       
  55.                 sbuf.append((char)ch);       
  56.             } else if ('0' <= ch && ch <= '</span><span class="number">9</span><span>') {    // '0'..'9' : as it was       
  57.                 sbuf.append((char)ch);       
  58.             } else if (ch == '-' || ch == '_'       // unreserved : as it was       
  59.                 || ch == '.' || ch == '!'       
  60.                 || ch == '~' || ch == '*'       
  61.                 || ch == '\'' || ch == '('       
  62.                 || ch == ')') {       
  63.                 sbuf.append((char)ch);       
  64.             } else if (ch <= 0x007F) {              // other ASCII : map to %XX       
  65.                 sbuf.append('%');       
  66.                 sbuf.append(hex[ch]);       
  67.             } else {                                // unicode : map to %uXXXX       
  68.                 sbuf.append('%');       
  69.                 sbuf.append('u');       
  70.                 sbuf.append(hex[(ch >>> 8)]);       
  71.                 sbuf.append(hex[(0x00FF & ch)]);       
  72.             }       
  73.         }       
  74.         return sbuf.toString();       
  75.     }       
  76.     public static String unescape(String s) {       
  77.         StringBuffer sbuf = new StringBuffer();       
  78.         int i = 0;       
  79.         int len = s.length();       
  80.         while (i < len) {       
  81.             int ch = s.charAt(i);       
  82.             if (ch == '+') {                        // + : map to ' '        
  83.                 sbuf.append(' ');       
  84.             } else if ('A' <= ch && ch <= 'Z') {    // 'A'..'Z' : as it was       
  85.                 sbuf.append((char)ch);       
  86.             } else if ('a' <= ch && ch <= 'z') {    // 'a'..'z' : as it was       
  87.                 sbuf.append((char)ch);       
  88.             } else if ('0' <= ch && ch <= '</span><span class="number">9</span><span>') {    // '0'..'9' : as it was       
  89.                 sbuf.append((char)ch);       
  90.             } else if (ch == '-' || ch == '_'       // unreserved : as it was       
  91.                 || ch == '.' || ch == '!'       
  92.                 || ch == '~' || ch == '*'       
  93.                 || ch == '\'' || ch == '('       
  94.                 || ch == ')') {       
  95.                 sbuf.append((char)ch);       
  96.             } else if (ch == '%') {       
  97.                 int cint = 0;       
  98.                 if ('u' != s.charAt(i+1)) {         // %XX : map to ascii(XX)       
  99.                     cint = (cint << 4) | val[s.charAt(i+1)];       
  100.                     cint = (cint << 4) | val[s.charAt(i+2)];       
  101.                     i+=2;       
  102.                 } else {                            // %uXXXX : map to unicode(XXXX)       
  103.                     cint = (cint << 4) | val[s.charAt(i+2)];       
  104.                     cint = (cint << 4) | val[s.charAt(i+3)];       
  105.                     cint = (cint << 4) | val[s.charAt(i+4)];       
  106.                     cint = (cint << 4) | val[s.charAt(i+5)];       
  107.                     i+=5;       
  108.                 }       
  109.                 sbuf.append((char)cint);       
  110.             }       
  111.             i++;       
  112.         }       
  113.         return sbuf.toString();       
  114.     }       
  115. //    public static void main(String[] args) {       
  116. //        String stest = "中文1234 abcd[]()<+>,.~\\";       
  117. //        System.out.println(stest);       
  118. //        System.out.println(escape(stest));       
  119. //        System.out.println(unescape(escape(stest)));       
  120. //    }       
  121. }       
1 请登录后投票
   发表时间:2007-12-14  
escpe并不好,用encodeURIComponent
0 请登录后投票
   发表时间:2007-12-21  
客户端: items:Ext.util.JSON.encode(items)
服务端这样:
strJsonData = new String(strJsonData.trim().getBytes("ISO-8859-1"), "utf-8");

就OK了
0 请登录后投票
   发表时间:2007-12-21  
客户端文件本身的存储格式是否UTF-8格式?
0 请登录后投票
   发表时间:2007-12-24  
看到了以下这段话:
碰到使用ajax获得数据,或者提交数据出现乱码
英文情况下不会出现乱码,用了中文才可能乱掉,这是因为咱们的win操作系统,保存文件的默认编码是gb2312,而ajax传输数据的默认编码是utf-8,推荐大家将数据格式统一为utf-8,不但可以解决眼前的乱码问题,对以后扩展为多语言也有好处。
0 请登录后投票
   发表时间:2007-12-24  
如果是做Ajax应用程序, 最好是整体上采用utf-8编码.

回楼主, Ext是用UTF-8的, 是你的服务端没有采用UTF-8.
0 请登录后投票
   发表时间:2008-01-24  
在Request Headers中设置Content-Type:application/x-www-form-urlencoded; charset=utf-8,具体方法:将Ext.lib.Ajax.defaultPostHeader += '; charset=utf-8'加在Ext.onReady块里,此方法可以解决用EXT在POST时的中文乱码问题。
0 请登录后投票
   发表时间:2008-02-18  
我的问题 到现在还没解决。也是乱码问题。我用的prototype
0 请登录后投票
   发表时间:2008-02-18  
真是老生常谈了,在2001年混CSDN的时候我就到处靠传播点encoding的基本常识来接分,7年过去了,抗战都要胜利了,咋还有人不断的栽倒在这上面呢?
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics