新华电脑教育网 设为首页 | 加入收藏 | 网站地图 | 招生咨询热线电话:010-67958088  
新华电脑教育北京新华电脑学校→咨询电话: 010-67958088  学校地址: 北京市大兴区旧宫镇庑殿路18号 (729公交总站向北300米) 88159900  咨询QQ-1:北京新华电脑学校欢迎您,我们将热情为您提供最专业的咨询服务
北京新华电脑学校学生组织:学生会网站项目部网络项目部设计项目部广播站我们真诚期待您的加入! 在线报名 在线留言 乘车路线 学校地图  咨询QQ-2:北京新华电脑学校欢迎您,我们将热情为您提供最专业的咨询服务
首页 >> 正文 权威认证介绍考证报考流程考证制度结业证办理流程考证证书规定考证模拟题下载考证模拟视频及考证注意事项CEAC奖学金
WML页面搜索显示乱码问题解决方法
     2008年09月24日15:39  阅:

详情请点击:365国家紧缺型人才培养计划(简称365计划)【技能(TECHNOLOGY)+学历(COLLEGE)】教育(简称TC精英教育)权威认证

本文关键字: 网页设计     学习制作网页      制作网页时出现的问题      wml输入中文关键字会出错      wml出错的解决办法     怎样解决wml中出现的错误       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 href="hol.wmls#check()" 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。

  

  上一条新闻:
  下一条新闻:
·成功新华人 ---more
     
  ·新华—电脑动漫艺术设计师专业
·新华—电脑环境装饰艺术设计专业
·新华—网站开发高级工程师专业..
·新华—网络技术高级工程师专业.
 
  ·TC精英教育(技能+学历教育)专业.

学院简介 | 专业设置 | 联系我们 | 乘车路线 | 学校地图 | 校园影吧 | 咨询邮箱| 校长信箱 | 网上报名 | 网上咨询 | 驻外招生办 | 郑重声明 | 高薪诚聘 | 友情链接

新华教育集团→北京新华电脑学校 学校地址: 北京市大兴区旧宫镇庑殿路18号(729公交总站向北300米) 北京新华电脑学校咨询电话: 010—67958088   咨询QQ: 88159900
版权所有 2005-2009 Copyright [www.bj-xinhua.com] All rights reserved 设计开发:北京新华电脑学校宣传办 站长信箱:hys_0202@163.com 备案号 京ICP备05076707号

备案号 京ICP备05076707号