WAP中,中文字符传递的解决方案
[color=red]
[b](Add by 2005-03-04)[/b]很多朋友问到ASP下面表单提交的问题,现给出源码下载,和实例,希望能给大家参考。
注:主要是表单提交时候,是否采用:e , :n ,和默认这集中形式<a>默认是:e,<anchor>默认是:n
测试地址:[b]下载源码到本机测试[/b]
用opera,或M3GATE点击测试
源码下载:[url=http://www.designer5.net/temp/test.rar]点击下载[/url]
【不能下载时PM通知我】
[/color]
[b]更好的解决方案:[url]http://bbs.blueidea.com/viewthread.php?tid=2055033[/url][/b]
制作WAP站点,你可以采用任何后台程序来相结合,ASP、ASP.NET、PHP、JSP等。
就我个人而言,我只试过ASP和PHP下的解决方案,经过测试,给出ASP、PHP下的解决方案。
[color=red][b]ASP中的问题参考下图:[/b][/color]
[img]http://www.designer5.net/article/upload_images/2004111151114.gif[/img]
上图中所所,如果文件采用UTF-8格式存储,字符编码设置为encoding="UTF-8",则会出现:采用A,GET方式提交的时候,有奇偶字符问题,也就是说提交偶数个字符没有问题,提交奇数个字符最后一个字符就会出现乱码;若采用<postfield>,POST方式提交,则还是需要解码16进制的函数。
如果是采用JavaScript则,接收页面:
<%@LANGUAGE="JAVASCRIPT" CODEPAGE="936"%>
……
<%= decodeURI(Request("name"))%>
[b]【2005年1月27日新添】WAP中文字符传递 ASP解决方案[/b]
ASP页面中,只要把Request来的数据采用以下函数URLDecode解码就可以了
<%=URLDecode(Request("name"))%>
[code]
<%
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")%>
[/code]
【WAP中文字符传递 PHP解决方案】
现在给出PHP中的完美解决方案,无论是采用普通ASCII码,还是UTF-8格式存储,提交的中文字符奇偶,都没有问题。
[b]采用普通文件格式ASCII码存储,保存为testgb.php[/b]
[code]
<?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">
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/>
</card>
</wml>
[/code]
[b]采用UTF-8格式存储,保存为test_utf.php[/b]
[code]
<?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">
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/>
</card>
</wml>
[/code]
JSP方面我不会,没有测试。
[b]JSP方面,苛子:测试也有中文奇偶字符问题[/b]
[code]
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;
}
[/code]
苛子说:这个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的解决方案,请详细参考图片的解释
[教程]WAP中,中文字符传递的PHP完美解决方案Asp.net的呢??怎么用啊...教教我啊..我是新手.
当一篇文章太长时,比如大于1000字,在手机中需要分页,这个时候分页是按[b]字数多少[/b]来进行分页的,虽然手机可以显示超过200个汉字,但是实际情况中,根据手机屏幕的大小,我们一般采取每页200个汉字,即:400个字符。
[b]通用按字数分页方法,适合中英文混排。[/b]
使用[color=red]WordPage($str,200);[/color]调用就可以了。
[code]
<?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;
}
?>
[/code]
[b]下面这个只适合英文和数字是全角的。[/b]
将所有要显示的文字赋值到字符串$str中,然后在$num中设置显示的字数就可以了。
用法为:
<?php
$str = "要显示的文字……";
page_num($str,200);
?>
[b]注:以下函数是页面采用UTF-8时的[/b]
如果采用GB2312,则把$num = $num*[color=red]3[/color];修改为$num = $num*[color]2[/color];
因为UTF-8格式中,一个中文占三个字节,GB2312中,一个中文字符占两个字节
[code]
<?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/>';
}
}
?>
[/code]
老大测试一下这样的例子,utf-8格式,参数传递的时候用的下面的方法:
<a href="***.php?actid=12&set=我爱我家">我爱我家</a>
php接收的时候用$set = $_GET['set'];但是显示出来的是乱码,又没有解决方法?
hlddn在上个帖子中说
[quote] 老大测试一下这样的例子,utf-8格式,参数传递的时候用的下面的方法:
<a href="***.php?actid=12&set=我爱我家">我爱我家</a>
php接收的时候用$set = $_GET['set'];但是显示出来的是乱码,又没有解决方法? [/quote]
[b]set=我爱我家[/b] 这个不是直接提交参数,而是通过input输入后,取得的表单变量,而且注意[color=red]$(name:e)[/color]这个时候,文字已经被编码了,而不是直接写到网址的后面,参考如下方法
<?php echo $_GET["name"]; ?>
<input name="name" emptyok="false" tabindex="2" format="*m"/>
<a href="test_utf.php?name=$(name:e)">提交aaa</a><br/>
如果是直接提交参数,怎么才能显示正确的中文呢?我现在困惑的就是这个。
WAP中文字符传递PHP解决方案,[新添加按字数分页函数]hlddn在上个帖子中说
[quote] 如果是直接提交参数,怎么才能显示正确的中文呢?我现在困惑的就是这个。 [/quote]
在提交传递变量的过程中,浏览器做了我们不想让他做的工作,都把变量给编码了,还是老老实实的解码吧,没有偷懒的办法。
楼主说的ASP并没有解决方案啊,我试了半天找不出函数来,麻烦指教下。
我是MDB数据库,必须要用ASP,还有,只能用ASP,不能联系到VB哟,呵呵
unicode要转为gb2312的这种,如果用GET过去能不能给出示例啊?
我用的是T618的手机,结果测试GET这种不成功。
麻烦了啊。谢谢。
就是如何将%BC%BC%CA%F5%D7%A8%C0%B8这类用中文显示出来,如果是IE可以自动显示的,但WML不支持,呵呵。
WAP中文字符传递PHP解决方案,[新添加按字数分页函数]gyjing在上个帖子中说
[quote] 就是如何将%BC%BC%CA%F5%D7%A8%C0%B8这类用中文显示出来,如果是IE可以自动显示的,但WML不支持,呵呵。 [/quote]
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")%>
使用如下函数得到中文:技术专栏
[code]
<%
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")%>
[/code]
谢谢楼主这么耐心的讲解~
虽然这个问题解决了,但我用T618手机测试并不支持$(name:e)这样的格式,真白忙一场了,看来还得走$(name)用UTF-8与ASCII之间的转换,这样更麻烦了。。。
现在WAP真不如HTM好,许多版本不互通,HTM没有头没有尾也成,呵呵,可这个少什么也不行。。。
如果楼主有时间,一同探讨下怎么解决在T618的手机上的问题,如果方便,请发信息告诉我你的联系方法,愿意做个师徒关系。
to 楼主
能否发个ASP的例子
nokia7210也不支持$(name:e)
WAP中文字符传递ASP,PHP解决方案%CE%D2%CA%C7%D6%D0%B9%FA%C8%CB
以上的文字应该是"我是中国人",但被编码后变成的上述的样子,不知是什么码.用decodeURL及上述ASP的URLDecode(enStr)都解不出来.高手帮忙呀.
是16进制编码
但是这个时候要考虑,是GB2312下,还是UTF-8
上面的URLDecode(enStr)只能解码GB2312下的16进制编码,如果是UTF-8就需要转码了
先解码URLDecode(“%CE%D2%CA%C7%D6%D0%B9%FA%C8%CB”)
然后再转码一次
如果你放在普通页面中,用IE浏览此解码后的字符,是可以的。
测试了版主yytcpt提供的代码,发现我的nokia7210不支持get提交,post提交正常.
谢谢版主!
但是网页[url]http://www.designer5.net/wap/temp/test.asp[/url]在WinWap中不能显示正确的中文呀.
zetazhou在上个帖子中说
[quote] 但是网页[url]http://www.designer5.net/wap/temp/test.asp[/url]在WinWap中不能显示正确的中文呀. [/quote]
因为WINWAP模拟器不支持UTF8编码(整个页面是UTF8编码的),其他模拟器可以。
实际也是以手机为准
Nokia7210,我还没发现,谢谢你的测试
我自己编的小程序,出现奇偶数字符的问题,怎么解决啊?
以下是代码
<%@ 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>
</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%>
<%=unicode2gb(Request("name"))%>
<do type="prev" label="返回"> <prev/> </do>
</card>
</wml>
支持原创!
[url]http://zhengyaohua.blogchina.com/[/url]
欢迎来我的博客网站进行交流!
不错,看得我想学
【WAP中文字符传递 PHP解决方案】
现在给出PHP中的完美解决方案,无论是采用普通ASCII码,还是UTF-8格式存储,提交的中文字符奇偶,都没有问题。
给出的这两个实例在 winwap 下不能用, 提交的中文变量 转成GB2312 之后都变成了 ÷ 号, 或者变成空值了, 这是怎么回事呢?
在M3Gate 下却可以正常使用, 各位高手帮帮忙回答一下
确实是篇好冬冬哦!!
help!我试了版主yytcpt提供的代码,使用的post提交方式,现在向access数据库中添加中文记录时,不再显示%*%*%*%*%*之类,但是还有有点问题,如输入:你好。显示:浣犲ソ锛
不知是什么码.请高手帮帮忙!!!.
页面编码,采用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")
版主,text:n 这个 :n是什么意思啊?
如果页面用GB2312,静态显示没有问题,但是表单提交会出现乱码,如果用ado.stream转换,又会出现奇数字缺字的问题(至少对于asp而言)
如果页面全部用UTF-8,数据库用access,也完全正常,请问这个之间UTF-8到GB2312的转换是不是系统自动完成的啊?
<针对jsp>
中文处理方法
1、jsp文件编码方式一定要为UTF-8,且contentType中charset一定要申明为UTF-8
2、普通显示文字直接输入,不需要转换
3、数据库读出、写入直接读写不需要转换
4、建议使用get方法传递(post方法会用乱码),在接受页面只要将ISO8859-1转换为UTF-8即可
starsword在上个帖子中说
[quote] 版主,text:n 这个 :n是什么意思啊?
如果页面用GB2312,静态显示没有问题,但是表单提交会出现乱码,如果用ado.stream转换,又会出现奇数字缺字的问题(至少对于asp而言)
如果页面全部用UTF-8,数据库用access,也完全正常,请问这个之间UTF-8到GB2312的转换是不是系统自动完成的啊?
[/quote]
:n是强制不进行URL转义的意思
ado.stream转换,是有奇偶数问题(我也不明白如何解决,所以我没用这个办法)
如果页面全部用UTF-8,数据库用access.
是因为页面和数据库编码统一了,所以不用转码了,页面是UTF8,数据库是unicode(包含UTF-8)
辛苦了,支持!
斑竹:
求救:
我要做一个asp在线生成表格的程序
我是个新手
我只能做个简单表头的
稍微复杂的我做不了
求救阿
哪里能找到适合UTF-8到gb2312的转换函数啊?
icp申请需要花费多少?请问各位大虾icp申请需要花费多少?
在frontpage中与oracle数据库连接实现查询功能,用"插入"->"数据库"->"结果"来连接数据库,进行相关的设置,实现查询,查询条件有"身份证号"和"姓名",他们是用or连接的,目的是用"身份证号"或"姓名"或("身份证号"和"姓名")进行查询,但是只有身份证号参数起作用,只用"姓名"参数查询不行,就是汉字转换问题,asp不能识别汉字,请问高手们help!!
测试地址:下载源码到本机测试
用opera,或M3GATE点击测试
------------------------------
我下载了,用opera测试,怎么也是乱码。
版主要是能列一些列子出来就好了~~这样说的话大家参考做起来就不用那么麻烦了
能给点实际的例子吗?我拿你的代码测试显示有错误
Microsoft VBScript 编译器错误 错误 '800a03f6'
缺少 'End'
/iisHelp/common/500-100.asp,行242
Microsoft JScript 编译错误 错误 '800a03ec'
缺少 ';'
/sms/jiayuan/test1.asp,行5
Function URLDecode(enStr)
---------^
快要崩溃了?VBS,JAVA 都用过了.....