wml在文本框中输入中文关键字搜索时,服务端获取到的值总是乱码的解决方法

wml在文本框中输入中文关键字搜索时,服务端获取到的值总是乱码,该如何解决?


现提供一个客户端对关键字编码,服务端再解析的方法,应该可以完美的解决这一问题。


wml文件:


<?xml version=”1.0″ encoding=”GB2312″?>


<!DOCTYPE wml PUBLIC “-//WAPFORUM//DTD WML 1.1//EN” “http://www.wapforum.org/DTD/wml_1.1.xml“>


<wml xml:lang=”zh-cn”>


<card id=”card1″ title=”卡片1″>


<!–提交到其他页面或服务端示例–>


<do type=”accept”>


输入值:


<input type=”text” name=”txtKey” maxlength=”20″/><br/>


<go method=”post”>


搜索


</go>


</do>


</card>


</wml>


 


Wmlscript文件(hol.wmls):


extern function check()


{


    var x = WMLBrowser.getVar(“txtKey”);


    var xx = URL.escapeString(x);


   


    var para = “skey=” + xx;


    WMLBrowser.go(“so.aspx?”+para);


}


 


服务端aspx.cs文件内容:


private void Page_Load(object sender, System.EventArgs e)


{


    // 在此处放置用户代码以初始化页面


    string url = Request.RawUrl;


    string key = QryStrUtil( url, “skey”);


    key = UnEscapeString (key);


}


另外还有两个方法:


/// <summary>


/// 获取原始Url中的制定参数的值


/// </summary>


/// <param name=”sRawUrl”>原始Url</param>


/// <param name=”sKey”>参数</param>


/// <returns>值</returns>


private string QryStrUtil (string sRawUrl, string sKey)


{


    string sValue = string.Empty;


    int index = sRawUrl.IndexOf(‘?’);


 


    if (-1 != index && -1 != sRawUrl.IndexOf(‘=’))


    {


       sRawUrl = sRawUrl.Substring(index + 1,  sRawUrl.Length – index – 1);


 


       string[] asParaInfo = sRawUrl.Split(‘&’);


       string _key = string.Empty;


       foreach(string sParaInfo in asParaInfo)


       {


           if (null == sParaInfo || string.Empty == sParaInfo)


              continue;


 


           index = sParaInfo.IndexOf(“=”);


           if (-1 == index)


              continue;


 


           _key = sParaInfo.Substring(0, index);


           if (_key == sKey)


           {


              sValue = sParaInfo.Substring(index + 1, sParaInfo.Length – index – 1);


           }


       }


    }


    return sValue;


}


/// <summary>


/// 汉字编码反转换


/// </summary>


/// <param name=”s”></param>


/// <returns></returns>


private string UnEscapeString(string s)


{


    string sub1, sub2, sub3;


    while(-1 != s.IndexOf(‘%’))


    {


       sub1 = s.Substring(0, s.IndexOf(‘%’));


       sub2 = s.Substring(sub1.Length,6);


       sub3 = s.Remove(0, sub1.Length + sub2.Length);


 


       sub2 = sub2.Remove(0,1);


 


       string[] scode = sub2.Split(‘%’);


       Byte[] bCodes = new byte[scode.Length];


       for(int i=0; i<scode.Length; i++)


       {


           int sh,sl,val;


           string code = scode[i];


           sh = Convert.ToInt32(code.Substring(0,1),16);


           sl = Convert.ToInt32(code.Substring(1,1),16);


 


           val = sh * 16 + sl;


           bCodes[i] = Convert.ToByte(val.ToString(),10);


       }


       sub2 = Encoding.GetEncoding(“gb2312”).GetString(bCodes);


       s = sub1 + sub2 + sub3;


    }


    return s;


}


至此,该方法以全部完毕,Page_Load中得到的key就是原输入字符串的原形。


 


――――――――――――――――――――――――――――――――――――
在这里提供EscapeString方法。


 


/// <summary>
/// 汉字编码转换(该方法还不完美,会对字母及数字等编码)


/// </summary>


/// <param name=”s”></param>


/// <returns></returns>


public string EscapeString(string s)


{


    string res = string.Empty;


    Byte[] bCodes = Encoding.GetEncoding(“gb2312”).GetBytes(s);


    ASCIIEncoding ascii = new ASCIIEncoding();


    for(int i=0;i<bCodes.Length ;i++)


    {


       int val = bCodes[i];


       val = (val < 0) ? val+256 : val;


       int sh,sl;


       sh = val/16;


       sl = val%16;


 


       res += “%”;


       res += Convert.ToString(sh,16);


       res += Convert.ToString(sl,16);


    }


    return res;


}



细心的读者会发现,如果用EscapeString编码,再用UnEscapeString来解码,可能会错误。所以这里,仅对全角及中文字符编码即可。不过这里暂时不需要同时用到这两个方法,在此把这个方法加上,仅是对wmlscript的escapeString方法的原理进行一下说明。


注:该方法的wmlscript解释是。这个函数计算生成s t r i n g的一个新版本。在这个版本中, [ R F C 1 7 3 8 ]规定的特殊字符(非安全字符、保留字符和不可打印字符)被一个十六进制的转义序列取代,给定的字符串可以这样转义;这个函数可以不进行U R L分析。根据[ R F C 1 7 8 3 ]的规定,对于U n i c o d e字符集中编码等于或者小于0 x F F的特殊字符,使用双数字格式的转义序列% x x。
http://www.cnblogs.com/lgamoy/archive/2007/01/03/610806.html