WAP建站入门教程
来源:yesky
被读3031次
转载请注明出处-中国设计秀-cnwebshow.com
GB2132转Unicode
Unicode的原理也很简单。使用“&#x”加上ASCII码的数值文本再加“;”结尾。当然要注意的是:这里所指的ASCII数值并不是简单的内存数值(或者说是GB2132编码)。例如:“饱”字,在内存里面的数值是0xb1a5,而在Unicode映射表内是0x9971。请先看下面的一段小程序。在WML页面中混有英文和中文。中文是采用Unicode书写的。
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1 //EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="main" title="Chinese">
<p>
T;⛳
</p>
</card>
</wml>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1 //EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="main" title="Chinese">
<p>
T;⛳
</p>
</card>
</wml>
在Nokia WAP Toolkit中的测试结果为(图2-35所示):
图 2-35 使用Unicode的中文WML页面
可以看到“⛳”变成了“饱”字。如果用“&#b1a5;”或者直接使用GB2132编码(相当于直接书写中文)那么显示结果就可能是图2-36所示的样子。肯定要问自己,怎么会这样!原因就是在这个位置上的Unicode编码字符是个怪字符。
图 2-36 没有使用Unicode的中文WML页面
对于英文字符可以使用Unicode方式,也可以不使用。那么Unicode编码如何获得呢?
如果使用手工方式,那么可以在“附件”中找到“Unicode映射表”。打开映射表,选择“宋体”和“CJK Unified Ideograph”,在里面可以找到很多中文字符的Unicode编码。随便拷贝一个到WML文件中,百试百灵!就是使用的时候不是很方便。
如果使用Visual Basic脚本语言编写服务端程序(例如:ASP),那么问题就简单多了。可以使用AscW这个函数来解决编码的问题。以下的几个编码函数就是这样做的。
如果使用Visual C&C++编写服务端程序,那么必须使用到Windows的一个API函数:MultiButeToWideChar。这个函数可以实现Unicode的转换。
对于其他服务端脚本语言也应该有类似的函数。如果没有,那么就必须自己做一个转换工具,能把WML中的中文转换为Unicode。在MSDN提供的例子中有一个小的转换工具:Uconvert。但是好像不是很好用,不过可以研究里面的程序。在网络上有不少这样的实用小工具。
如果使用手工方式,那么可以在“附件”中找到“Unicode映射表”。打开映射表,选择“宋体”和“CJK Unified Ideograph”,在里面可以找到很多中文字符的Unicode编码。随便拷贝一个到WML文件中,百试百灵!就是使用的时候不是很方便。
如果使用Visual Basic脚本语言编写服务端程序(例如:ASP),那么问题就简单多了。可以使用AscW这个函数来解决编码的问题。以下的几个编码函数就是这样做的。
如果使用Visual C&C++编写服务端程序,那么必须使用到Windows的一个API函数:MultiButeToWideChar。这个函数可以实现Unicode的转换。
对于其他服务端脚本语言也应该有类似的函数。如果没有,那么就必须自己做一个转换工具,能把WML中的中文转换为Unicode。在MSDN提供的例子中有一个小的转换工具:Uconvert。但是好像不是很好用,不过可以研究里面的程序。在网络上有不少这样的实用小工具。
适用于ASP的转换程序
<%=replace(Server.HTMLEncode(request.form("text")),chr(13)+chr(10),"<BR>")%> >
以下是您的UNICODE码:
<textarea name="text" cols="40" rows="10">
<%=Server.HTMLEncode(unicode(request.form("text")))%>
以下是您的UNICODE码:
<textarea name="text" cols="40" rows="10">
<%=Server.HTMLEncode(unicode(request.form("text")))%>
第一个Basic程序
function unicode(str)
for i = 1 to Len(str)
c = Mid(str, i, 1)
unicode = unicode & "&#x" & Hex(AscW(c)) & ";"
next
end function
for i = 1 to Len(str)
c = Mid(str, i, 1)
unicode = unicode & "&#x" & Hex(AscW(c)) & ";"
next
end function
第二个Basic程序
function unicode(str)
dim i,j,c,i1,i2,u,fs,f,p
unicode=""
p=""
for i=1 to len(str)
c=mid(str,i,1)
j=ascw(c)
if j<0 then
j=j+65536
end if
if j>=0 and j<=128 then
if p="c" then
unicode=" "&unicode
p="e"
end if
unicode=unicode&c
else
if p="e" then
unicode=unicode&" "
p="c"
end if
unicode=unicode&"&#"&j&";"
end if
next
end function
dim i,j,c,i1,i2,u,fs,f,p
unicode=""
p=""
for i=1 to len(str)
c=mid(str,i,1)
j=ascw(c)
if j<0 then
j=j+65536
end if
if j>=0 and j<=128 then
if p="c" then
unicode=" "&unicode
p="e"
end if
unicode=unicode&c
else
if p="e" then
unicode=unicode&" "
p="c"
end if
unicode=unicode&"&#"&j&";"
end if
next
end function
八、动态输出WBMP
WBMP的格式
对于一个宽为16个像素,高15个像素的白色画面,WBMP文件的数据如下:
0x00,0x00,0x10,0x0f,0xff,0xff.……0xff。
头两个字节为0。第一个字节是文件类型,0表示非压缩的黑白图片。第二个是文件扩展,是保留字段。第三个字节为图片的宽。第四个字节图片的高。后面的都是图像数据。
对于非压缩的黑白图片,数据格式有以下特点:每个位对应着一个像素。0表示黑色,1表示白色。高位开始到底位结束对应着从左到右的像素颜色。数据从低地址到高地址对应着图片从上到下。一个字节可以表示8个像素,不足的部分可以用0补齐。
下面是一张太阳的图片:
0x00,0x00,0x10,0x0f,0xff,0xff.……0xff。
头两个字节为0。第一个字节是文件类型,0表示非压缩的黑白图片。第二个是文件扩展,是保留字段。第三个字节为图片的宽。第四个字节图片的高。后面的都是图像数据。
对于非压缩的黑白图片,数据格式有以下特点:每个位对应着一个像素。0表示黑色,1表示白色。高位开始到底位结束对应着从左到右的像素颜色。数据从低地址到高地址对应着图片从上到下。一个字节可以表示8个像素,不足的部分可以用0补齐。
下面是一张太阳的图片:
0x00 //file type=0
0x00 //file extension 没有使用
0x14 //宽
0x14 //高
//Pixel data
0xfa,0xf5,0xf0,0xfb,0x6d,0xf0,0xfb,0xad,0xf0,0xfb,
0xdd,0x80,0x1b,0xfc,0x70,0xe7,0x1f,0xe0,0x7c,0xe7,
0xd0,0xbb,0xfb,0xd0,0xdb,0xfb,0xb0,0xd7,0xfd,0x70,
0xb7,0xfd,0xb0,0x77,0xf5,0xd0,0xfb,0xeb,0xe0,0xfb,
0xdb,0xf0,0x1c,0xe7,0x80,0xc7,0x1c,0x70,0xf7,0xfd,
0xf0,0xf7,0xbf,0xf0,0xf6,0x5d,0xf0,0xf5,0xed,0xf00
0x00 //file extension 没有使用
0x14 //宽
0x14 //高
//Pixel data
0xfa,0xf5,0xf0,0xfb,0x6d,0xf0,0xfb,0xad,0xf0,0xfb,
0xdd,0x80,0x1b,0xfc,0x70,0xe7,0x1f,0xe0,0x7c,0xe7,
0xd0,0xbb,0xfb,0xd0,0xdb,0xfb,0xb0,0xd7,0xfd,0x70,
0xb7,0xfd,0xb0,0x77,0xf5,0xd0,0xfb,0xeb,0xe0,0xfb,
0xdb,0xf0,0x1c,0xe7,0x80,0xc7,0x1c,0x70,0xf7,0xfd,
0xf0,0xf7,0xbf,0xf0,0xf6,0x5d,0xf0,0xf5,0xed,0xf00
以下的两个程序都是要显示一个长为5高为2的WBMP图片。该图片第一行为白色,第二行为黑色。为此使用Nokia WAP Toolkit做了一个5*2的WBMP图片,上行是黑的,下行是白的。整个WBMP文件总共六个字节,所有的数据如下:
0x00 //file type=0表示黑白的非压缩方式
0x00 //file extension保留字段
0x05 //宽
0x02 //高
0x00 //第一行像素
0xf8 //第二行像素
0x00 //file extension保留字段
0x05 //宽
0x02 //高
0x00 //第一行像素
0xf8 //第二行像素
由于宽为5不是8的倍数,因此右边的位使用0补齐。因此出现了第二行的0xf8,换成二进制就是:11111000。只有左边的五位是1,剩余的三位是0。
需要注意的是:在做测试之前需要在MIME文件类型映射表中加入相应的WBMP文件映射。
需要注意的是:在做测试之前需要在MIME文件类型映射表中加入相应的WBMP文件映射。
使用ASP动态输出WBMP图片
wbmp.asp
<%@ Language=VBScript %>
<%
Function StoB(varstr)
str2bin = ""
For i = 1 To Len(varstr)
varchar = Mid(varstr, i, 1)
str2bin = str2bin & ChrB(AscB(varchar))
Next
StoB = str2bin
End Function
img=chr(0) & chr(0) & chr(5) & chr(2) & chr(0) & chr(&Hf8)
Response.ContentType="image/vnd.wap.wbmp"
Response.BinaryWrite stob(img)
%>
<%@ Language=VBScript %>
<%
Function StoB(varstr)
str2bin = ""
For i = 1 To Len(varstr)
varchar = Mid(varstr, i, 1)
str2bin = str2bin & ChrB(AscB(varchar))
Next
StoB = str2bin
End Function
img=chr(0) & chr(0) & chr(5) & chr(2) & chr(0) & chr(&Hf8)
Response.ContentType="image/vnd.wap.wbmp"
Response.BinaryWrite stob(img)
%>
WML调用部分的程序如下:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="main">
<p>
<img src="http://127.0.0.1/wap/wbmp.asp" alt=":)" />
</p>
</card>
</wml>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="main">
<p>
<img src="http://127.0.0.1/wap/wbmp.asp" alt=":)" />
</p>
</card>
</wml>
启动Nokia WAP Toolkit,在“Go”下选择“Open Location”,并输入URL地址(图2-37):
图 2-37 输入URL地址
在确认后,模拟器上出现图2-38:(短短的一条直线正是想要的WBMP!)
图 2-38 动态输出的WBMP图像
使用ISAPI动态输出WBMP图片
先使用Visual C&C++ 6.0的ISAPI Wizard生成一个工程文件——WBMP。在WBMP.cpp中找到Default(CHttpServerContext* pCtxt)函数。按照下面的形式进行修改:
void CWBMPExtension::Default(CHttpServerContext* pCtxt)
{
/*
StartContent(pCtxt);
WriteTitle(pCtxt);
*pCtxt << _T("This default message was produced by the Internet");
*pCtxt << _T(" Server DLL Wizard. Edit your CWBMPExtension::Default()");
*pCtxt << _T(" implementation to change it.rn");
EndContent(pCtxt);
*/
AddHeader(pCtxt, "Content-type: image/vnd.wap.wbmprn");
BYTE img[6]={0x00,0x00,0x05,0x02,0x00,0xf8};
CHtmlStream htmlStream;
htmlStream.Write(img,6);
*pCtxt<<htmlStream;
}
{
/*
StartContent(pCtxt);
WriteTitle(pCtxt);
*pCtxt << _T("This default message was produced by the Internet");
*pCtxt << _T(" Server DLL Wizard. Edit your CWBMPExtension::Default()");
*pCtxt << _T(" implementation to change it.rn");
EndContent(pCtxt);
*/
AddHeader(pCtxt, "Content-type: image/vnd.wap.wbmprn");
BYTE img[6]={0x00,0x00,0x05,0x02,0x00,0xf8};
CHtmlStream htmlStream;
htmlStream.Write(img,6);
*pCtxt<<htmlStream;
}
WML调用部分的程序如下:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="main">
<p>
<img src="http://127.0.0.1/wap/wbmp.dll" alt=":)" />
</p>
</card>
</wml>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="main">
<p>
<img src="http://127.0.0.1/wap/wbmp.dll" alt=":)" />
</p>
</card>
</wml>
启动Nokia WAP Toolkit,在“Go”下选择“Open Location”,并输入URL地址(图2-39):
图 2-39 输入URL地址
在确认后,模拟器上出现图2-40所示的内容:(短短的一条直线正是想要的WBMP!)
图 2-40 动态输出的WBMP图像