打印

WAP中文字符传递ASP,PHP解决方案[添asp解决源码]

WAP中,中文字符传递的解决方案


(Add by 2005-03-04)很多朋友问到ASP下面表单提交的问题,现给出源码下载,和实例,希望能给大家参考。

注:主要是表单提交时候,是否采用:e  , :n ,和默认这集中形式<a>默认是:e,<anchor>默认是:n

测试地址:下载源码到本机测试
用opera,或M3GATE点击测试

源码下载:点击下载
【不能下载时PM通知我】


更好的解决方案:http://bbs.blueidea.com/viewthread.php?tid=2055033


制作WAP站点,你可以采用任何后台程序来相结合,ASP、ASP.NET、PHP、JSP等。
就我个人而言,我只试过ASP和PHP下的解决方案,经过测试,给出ASP、PHP下的解决方案。

ASP中的问题参考下图:



上图中所所,如果文件采用UTF-8格式存储,字符编码设置为encoding="UTF-8",则会出现:采用A,GET方式提交的时候,有奇偶字符问题,也就是说提交偶数个字符没有问题,提交奇数个字符最后一个字符就会出现乱码;若采用<postfield>,POST方式提交,则还是需要解码16进制的函数。

如果是采用JavaScript则,接收页面:
<%@LANGUAGE="JAVASCRIPT" CODEPAGE="936"%>
……
<%= decodeURI(Request("name"))%>

【2005年1月27日新添】WAP中文字符传递 ASP解决方案

ASP页面中,只要把Request来的数据采用以下函数URLDecode解码就可以了

<%=URLDecode(Request("name"))%>
复制内容到剪贴板
代码:
<%
Function URLDecode(enStr)
    dim deStr
    dim c,i,v
    deStr=""
    for i=1 to len(enStr)
        c=Mid(enStr,i,1)
        if c="%" then
            v=eval("&h"+Mid(enStr,i+1,2))
            if v<128 then
                deStr=deStr&chr(v)
                i=i+2
            else
                if isvalidhex(mid(enstr,i,3)) then
                    if isvalidhex(mid(enstr,i+3,3)) then
                        v=eval("&h"+Mid(enStr,i+1,2)+Mid(enStr,i+4,2))
                        deStr=deStr&chr(v)
                        i=i+5
                    else
                        v=eval("&h"+Mid(enStr,i+1,2)+cstr(hex(asc(Mid(enStr,i+3,1)))))
                        deStr=deStr&chr(v)
                        i=i+3
                    end if
                else
                    destr=destr&c
                end if
            end if
        else
            if c="+" then
                deStr=deStr&" "
            else
                deStr=deStr&c
            end if
        end if
    next
    URLDecode=deStr
end function
function isvalidhex(str)
    isvalidhex=true
    str=ucase(str)
    if len(str)<>3 then isvalidhex=false:exit function
    if left(str,1)<>"%" then isvalidhex=false:exit function
        c=mid(str,2,1)
    if not (((c>="0") and (c<="9")) or ((c>="A") and (c<="Z"))) then isvalidhex=false:exit function
        c=mid(str,3,1)
    if not (((c>="0") and (c<="9")) or ((c>="A") and (c<="Z"))) then isvalidhex=false:exit function
end function
%>
<%=URLDecode("%BC%BC%CA%F5%D7%A8%C0%B8")%>
【WAP中文字符传递 PHP解决方案】
现在给出PHP中的完美解决方案,无论是采用普通ASCII码,还是UTF-8格式存储,提交的中文字符奇偶,都没有问题。

采用普通文件格式ASCII码存储,保存为testgb.php
复制内容到剪贴板
代码:
<?php
header("Content-Type: text/vnd.wap.wml;charset=GB2312");
echo '<?xml version="1.0" encoding="GB2312"?>';
echo '<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">';
?>
<wml>
<card id="main" title="PHP Web">
<p>
GET提交,结果:
<?php echo iconv("utf-8", "gb2312",$_GET["name"]);?><br/>
POST提交,结果:
<?php echo iconv("utf-8", "gb2312",urldecode($_POST["name"])); ?><br/>
<input name="name" emptyok="false" tabindex="2" format="*m"/>
<a href="testgb.php?name=$(name:e)">提交aaa</a><br/>
<anchor>提交anchor
<go href="testgb.php" method="post">
<postfield name="name" value="$(name:e)" />
</go>
</anchor><br/>
</p>
</card>
</wml>
采用UTF-8格式存储,保存为test_utf.php
复制内容到剪贴板
代码:
<?php
header("Content-Type: text/vnd.wap.wml;charset=UTF-8");
echo '<?xml version="1.0" encoding="UTF-8"?>';
echo '<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">';
?>
<wml>
<card id="main" title="PHP Web">
<p>
GET提交,结果:
<?php echo $_GET["name"]; ?><br/>
POST提交,结果:
<?php echo urldecode($_POST["name"]); ?><br/>
<input name="name" emptyok="false" tabindex="2" format="*m"/>
<a href="test_utf.php?name=$(name:e)">提交aaa</a><br/>
<anchor>提交anchor
<go href="test_utf.php" method="post">
<postfield name="name" value="$(name:e)" />
</go>
</anchor><br/>
</p>
</card>
</wml>
JSP方面我不会,没有测试。

JSP方面,苛子:测试也有中文奇偶字符问题
复制内容到剪贴板
代码:
public static String decode(String s)
{
StringBuffer stringbuffer = new StringBuffer();
s = s.replace('%','0');
for(int i=1; i<s.length(); i+=3)
{
if(s.charAt(i)=='+')
{
stringbuffer.append(' ');
i++;
continue;
}
try {
stringbuffer.append((char)Integer.parseInt(s.substring(i, i+2), 16));
} catch (Exception e) {
}
}
String s1 = stringbuffer.toString();
try
{
byte abyte0[] = s1.getBytes("ISO-8859-1");
s1 = new String(abyte0, "UTF-8");
}
catch(UnsupportedEncodingException unsupportedencodingexception) {}
return s1;
}
苛子说:这个decode是我修改过了的, Servlet里面那个decode好像有问题,解不了奇数个的中文.
这个decode是我修改过了的, Servlet里面那个decode好像有问题,解不了奇数个的中文.

其他可参考:
http://bbs.blueidea.com/viewthread.php?tid=1808167
http://bbs.blueidea.com/viewthread.php?tid=1499094

[教程]WAP中,中文字符传递的PHP完美解决方案

楼主辛苦了,支持!

[教程]WAP中,中文字符传递的PHP完美解决方案

ASP的呢?我只会ASP呀~~呜呜~~

[教程]WAP中,中文字符传递的PHP完美解决方案

有关ASP的解决方案,请详细参考图片的解释

TOP

还在为头像烦恼?还在为不能关注好友动态烦忧?快来蓝色理想家园吧!

[教程]WAP中,中文字符传递的PHP完美解决方案

Asp.net的呢??怎么用啊...教教我啊..我是新手.

TOP

[教程]WAP中,中文字符传递的PHP完美解决方案

当一篇文章太长时,比如大于1000字,在手机中需要分页,这个时候分页是按字数多少来进行分页的,虽然手机可以显示超过200个汉字,但是实际情况中,根据手机屏幕的大小,我们一般采取每页200个汉字,即:400个字符。


通用按字数分页方法,适合中英文混排。
使用WordPage($str,200);调用就可以了。
复制内容到剪贴板
代码:
<?php
    //此文件UTF-8格式
    $str = "按说寒冬早过,春日回暖,可天怎么还这么冷,就跟我的心情差不多。“最近比较烦比较烦比较烦”,唉,能不烦吗,今年是建安十二年,我已整整26岁,眼看直奔30,可我还在躬耕陇亩,一事无成,真是郁闷呀。前几天出了一趟门,其实也没什么事,就是消谴消谴。跟我那几个狐朋狗友开车到北边的水库钓钓鱼、划划船,又到西边山上的庙里抽了一签。那个仙风道骨的庙长说我这一签非同小可,有贵人来访、卧龙飞天之兆,硬跟我要二千文铜钱。啊呸,简直是敲诈,我丢给他50文了事。下山途中我想,这老家伙怎么知道我的外号叫卧龙的?";
    WordPage($str,200);
function WordPage($str, $num=200)
{
    //$num = 200;        一页显示多少汉字
    $str = iconv("utf-8","gb2312",$str);
    $PageAll = strlen($str)/($num*2)-1;
    echo $PageAll;
    $PageAll = ceil($PageAll);
    if ($_GET['i']=="")
    {
        $i = 1;
    }
    else
    {
        $i = $_GET['i'];
    }
    $start = $i*$num;
    //echo 'start='.$start;
    $str = csubstr($str, $start, $num);
    $str = iconv("gb2312","utf-8",$str);
    echo $str.'<br/>';
    echo $i.'===='.$PageAll.'<br/>';
    if( (1<=$i) && ($i<=$PageAll))
    {
        if( $i>1 )
        {
            echo '<a href="'.$_SERVER["PHP_SELF"].'?i='.($i-1).'">上一页</a><br/>';
        }
        if($i < $PageAll)
        {
            echo '<a href="'.$_SERVER["PHP_SELF"].'?i='.($i+1).'">下一页</a><br/>';
        }
    }
}
    Function  csubstr($str,$start,$len)   
    {   
        $strlen=strlen($str);   
        $clen=0;   
        for($i=0;$i<$strlen;$i++,$clen++)   
        {   
            if  ($clen>=$start+$len)   
            break;   
            if(ord(substr($str,$i,1))>0xa0)   
            {   
                if  ($clen>=$start)   
                $tmpstr.=substr($str,$i,2);   
                $i++;   
            }   
            else   
            {   
                if  ($clen>=$start)   
                $tmpstr.=substr($str,$i,1);   
            }   
        }   
        
        return  $tmpstr;   
    }  
?>    
下面这个只适合英文和数字是全角的。


将所有要显示的文字赋值到字符串$str中,然后在$num中设置显示的字数就可以了。
用法为:

<?php
    $str = "要显示的文字……";
    page_num($str,200);
?>

注:以下函数是页面采用UTF-8时的

如果采用GB2312,则把$num = $num*3;修改为$num = $num*[color]2;
因为UTF-8格式中,一个中文占三个字节,GB2312中,一个中文字符占两个字节
复制内容到剪贴板
代码:
<?php
    function page_num($str, $num = 200)
    {
        //num=200    控制一页显示多少汉字
        $num = $num*3;
        if ($_GET['page']=="")
        {
            $page = 0;
        }
        else
        {
            $page = $_GET['page'];
        }
        if (strlen($str) > $num)
        {
            $str = substr($str, $num*$page, $num);
            echo $str.'<br/>';
            if ($page < (strlen($str)/$num))
                {
                    echo '<a href="page.php?page='.($page+1).'">下一页</a><br/>';
                }
            elseif($page > strlen($str)/$num)
                {
                    echo '<a href="page.php?page='.($page-1).'">上一页</a><br/>';
                }
            else
                {
                    echo '<a href="page.php?page='.($page+1).'">下一页</a><br/>';
                    echo '<a href="page.php?page='.($page-1).'">上一页</a><br/>';
                }
            $page++;
        }
        else
        {
            echo $str.'<br/>';
        }
    }
?>

TOP

WAP中文字符传递PHP解决方案,[新添加按字数分页函数]

老大测试一下这样的例子,utf-8格式,参数传递的时候用的下面的方法:
<a href="***.php?actid=12&set=我爱我家">我爱我家</a>
php接收的时候用$set = $_GET['set'];但是显示出来的是乱码,又没有解决方法?

TOP

WAP中文字符传递PHP解决方案,[新添加按字数分页函数]

hlddn在上个帖子中说
引用:
老大测试一下这样的例子,utf-8格式,参数传递的时候用的下面的方法:
<a href="***.php?actid=12&set=我爱我家">我爱我家</a>
php接收的时候用$set = $_GET['set'];但是显示出来的是乱码,又没有解决方法?
set=我爱我家  这个不是直接提交参数,而是通过input输入后,取得的表单变量,而且注意$(name:e)这个时候,文字已经被编码了,而不是直接写到网址的后面,参考如下方法

<?php echo $_GET["name"]; ?>

<input name="name" emptyok="false" tabindex="2" format="*m"/>
<a href="test_utf.php?name=$(name:e)">提交aaa</a><br/>

TOP

WAP中文字符传递PHP解决方案,[新添加按字数分页函数]

如果是直接提交参数,怎么才能显示正确的中文呢?我现在困惑的就是这个。

TOP

WAP中文字符传递PHP解决方案,[新添加按字数分页函数]

hlddn在上个帖子中说
引用:
如果是直接提交参数,怎么才能显示正确的中文呢?我现在困惑的就是这个。
在提交传递变量的过程中,浏览器做了我们不想让他做的工作,都把变量给编码了,还是老老实实的解码吧,没有偷懒的办法。

TOP

WAP中文字符传递PHP解决方案,[新添加按字数分页函数]

楼主说的ASP并没有解决方案啊,我试了半天找不出函数来,麻烦指教下。

我是MDB数据库,必须要用ASP,还有,只能用ASP,不能联系到VB哟,呵呵

unicode要转为gb2312的这种,如果用GET过去能不能给出示例啊?

我用的是T618的手机,结果测试GET这种不成功。

麻烦了啊。谢谢。

TOP

WAP中文字符传递PHP解决方案,[新添加按字数分页函数]

就是如何将%BC%BC%CA%F5%D7%A8%C0%B8这类用中文显示出来,如果是IE可以自动显示的,但WML不支持,呵呵。

TOP

WAP中文字符传递PHP解决方案,[新添加按字数分页函数]

gyjing在上个帖子中说
引用:
就是如何将%BC%BC%CA%F5%D7%A8%C0%B8这类用中文显示出来,如果是IE可以自动显示的,但WML不支持,呵呵。
Javascript函数:
decodeURL(%BC%BC%CA%F5%D7%A8%C0%B8)
可以转换

PHP函数:
urldecode(%BC%BC%CA%F5%D7%A8%C0%B8)

ASP函数:(ASP中默认的没有类似decodeURL函数,需要自己编写,以下函数通过网络搜集得到。)

<%=URLDecode("%BC%BC%CA%F5%D7%A8%C0%B8")%>

使用如下函数得到中文:技术专栏
复制内容到剪贴板
代码:
<%
Function URLDecode(enStr)
    dim deStr
    dim c,i,v
    deStr=""
    for i=1 to len(enStr)
        c=Mid(enStr,i,1)
        if c="%" then
            v=eval("&h"+Mid(enStr,i+1,2))
            if v<128 then
                deStr=deStr&chr(v)
                i=i+2
            else
                if isvalidhex(mid(enstr,i,3)) then
                    if isvalidhex(mid(enstr,i+3,3)) then
                        v=eval("&h"+Mid(enStr,i+1,2)+Mid(enStr,i+4,2))
                        deStr=deStr&chr(v)
                        i=i+5
                    else
                        v=eval("&h"+Mid(enStr,i+1,2)+cstr(hex(asc(Mid(enStr,i+3,1)))))
                        deStr=deStr&chr(v)
                        i=i+3
                    end if
                else
                    destr=destr&c
                end if
            end if
        else
            if c="+" then
                deStr=deStr&" "
            else
                deStr=deStr&c
            end if
        end if
    next
    URLDecode=deStr
end function
function isvalidhex(str)
    isvalidhex=true
    str=ucase(str)
    if len(str)<>3 then isvalidhex=false:exit function
    if left(str,1)<>"%" then isvalidhex=false:exit function
        c=mid(str,2,1)
    if not (((c>="0") and (c<="9")) or ((c>="A") and (c<="Z"))) then isvalidhex=false:exit function
        c=mid(str,3,1)
    if not (((c>="0") and (c<="9")) or ((c>="A") and (c<="Z"))) then isvalidhex=false:exit function
end function
%>
<%=URLDecode("%BC%BC%CA%F5%D7%A8%C0%B8")%>

TOP

WAP中文字符传递ASP,PHP解决方案

谢谢楼主这么耐心的讲解~

虽然这个问题解决了,但我用T618手机测试并不支持$(name:e)这样的格式,真白忙一场了,看来还得走$(name)用UTF-8与ASCII之间的转换,这样更麻烦了。。。


现在WAP真不如HTM好,许多版本不互通,HTM没有头没有尾也成,呵呵,可这个少什么也不行。。。

如果楼主有时间,一同探讨下怎么解决在T618的手机上的问题,如果方便,请发信息告诉我你的联系方法,愿意做个师徒关系。

TOP

WAP中文字符传递ASP,PHP解决方案

to 楼主
能否发个ASP的例子

TOP

WAP中文字符传递ASP,PHP解决方案

nokia7210也不支持$(name:e)

TOP

WAP中文字符传递ASP,PHP解决方案

%CE%D2%CA%C7%D6%D0%B9%FA%C8%CB

以上的文字应该是"我是中国人",但被编码后变成的上述的样子,不知是什么码.用decodeURL及上述ASP的URLDecode(enStr)都解不出来.高手帮忙呀.

TOP

WAP中文字符传递ASP,PHP解决方案


是16进制编码
但是这个时候要考虑,是GB2312下,还是UTF-8
上面的URLDecode(enStr)只能解码GB2312下的16进制编码,如果是UTF-8就需要转码了

先解码URLDecode(“%CE%D2%CA%C7%D6%D0%B9%FA%C8%CB”)
然后再转码一次
如果你放在普通页面中,用IE浏览此解码后的字符,是可以的。

TOP

测试了版主yytcpt提供的代码,发现我的nokia7210不支持get提交,post提交正常.
谢谢版主!

TOP

但是网页http://www.designer5.net/wap/temp/test.asp在WinWap中不能显示正确的中文呀.

TOP

zetazhou在上个帖子中说
引用:
但是网页http://www.designer5.net/wap/temp/test.asp在WinWap中不能显示正确的中文呀.
因为WINWAP模拟器不支持UTF8编码(整个页面是UTF8编码的),其他模拟器可以。
实际也是以手机为准

Nokia7210,我还没发现,谢谢你的测试

TOP

我自己编的小程序,出现奇偶数字符的问题,怎么解决啊?
以下是代码

<%@ Language=VBScript %>
<% Response.ContentType="text/vnd.wap.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>
<card id="a" title="Example">
<p align="left">
姓名:  
<input name="name"/>
<anchor>查询
<go href="2.asp" method="post" >
<postfield name="name" value="$(name)"/>
</go>
</anchor>
</p>
</card>
</wml>
//2.asp
<%@ Language=VBScript %>
<% Response.ContentType="text/vnd.wap.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>
<card id="a" title="Example">
<%function unicode2gb(str)
Set objstream=Server.CreateObject("ADODB.Stream")
objStream.type=2
objStream.Mode=3
objStream.Open
objStream.Charset="gb2312"
objStream.WriteText(trim(str))
objStream.Position=0
objStream.type=2
objStream.Charset="utf-8"
unicode2gb = trim(objStream.ReadText)
objstream.Close
set objstream=nothing
End Function%>
<p><%=unicode2gb(Request("name"))%></p>
<do type="prev" label="返回"> <prev/> </do>
</card>
</wml>

TOP

支持原创!
http://zhengyaohua.blogchina.com/
欢迎来我的博客网站进行交流!
迷茫人生,我想对你说:坚持是生存的一种本领,也是一种耐心和等待,坚持的过程其实是磨练的过程,在这个过程中,给临阵脱逃者的回报往往是失败,给知难而上者的回报大都是成功。  没有输在起跑点上这回事,人生是看终点,不是看起跑点。--沙溪秀才

TOP

不错,看得我想学

TOP

【WAP中文字符传递 PHP解决方案】
现在给出PHP中的完美解决方案,无论是采用普通ASCII码,还是UTF-8格式存储,提交的中文字符奇偶,都没有问题。

给出的这两个实例在 winwap 下不能用, 提交的中文变量 转成GB2312 之后都变成了 ÷ 号, 或者变成空值了,  这是怎么回事呢?

在M3Gate 下却可以正常使用, 各位高手帮帮忙回答一下

TOP

确实是篇好冬冬哦!!
冰古blog

中文wordpress blogs大集合:Come on, add yours!

TOP

help!

我试了版主yytcpt提供的代码,使用的post提交方式,现在向access数据库中添加中文记录时,不再显示%*%*%*%*%*之类,但是还有有点问题,如输入:你好。显示:浣犲ソ锛
不知是什么码.请高手帮帮忙!!!.

TOP

页面编码,采用UTF-8编码

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<% Response.ContentType="text/vnd.wap.wml;charset=UTF-8" %>
<?xml version="1.0" encoding="UTF-8"?>

输入表单:<input name="text">

提交变量:<postfield name="text" value="$(text:n)" />

接收字符:Request.From("text")

TOP

版主,text:n 这个 :n是什么意思啊?

如果页面用GB2312,静态显示没有问题,但是表单提交会出现乱码,如果用ado.stream转换,又会出现奇数字缺字的问题(至少对于asp而言)

如果页面全部用UTF-8,数据库用access,也完全正常,请问这个之间UTF-8到GB2312的转换是不是系统自动完成的啊?

TOP