用ASP实现中英文字体的自动选择
在Windows系统中,每一种语言的字符的显示都有对应的默认字体,例如在大部分的应用程序中,简体中文(GB2312)字符默认的显示字体是“宋体”,英文字符则为“Arial”。使用这种默认字体不仅可以照顾到大多数的客户端系统不会出现缺少此类字体的尴尬局面,重要的是还能达到此类字符的显示与打印的最大限度上的工整与美观,与人们的阅读习惯保持一致。
提出问题
在Word 97/2000中,文档正文默认的字体样式是:中文字符的字体是宋体(简体中文,GB2312或GBK),英文字符的字体则是“Times New Roman”。其实在GB2312编码的宋体字库中本身就包含了英文字符的显示与打印支持,但是为什么Word还要另外设置呢?如图1所示:图中第一行英文字母的字体被设置为“Times New Roman”,第二行则被设置为“宋体”。
图1
从图1中可以看出,被设置为宋体的英文字符显示效果比较接近于简体中文的拼音字母,作为英文段落来讲这样设置不太符合人们的阅读习惯,所以Word中对中英文字体的分别设置并不是多此一举。
在简体中文网页中,由于浏览器默认的或者由网页编写者指定的网页正文(<body>……</body>)的字体设置一般都是宋体,这样,中英文使用同样的字体设置就会使字体显示失去整体的美观。
为了解决这个问题,我们可以对网页中出现的所有英文字符分别进行字体风格设置,但是这样做不仅会极大地加重网页制作人员的工作量,使代码看上去烦琐拖沓,还会大大增加网页代码的长度,造成页面下载缓慢。如果直接把整个页面的主体部分的字体设置为英文字体样式,如“Times New Roman”等,在这种情况下,虽然浏览器在显示中文字符的时候会自动使用默认的中文字体设置,但同一个页面在不同设置的浏览器的浏览下将会出现意外的折行、段落混乱等显示错误。
编程实现
本文介绍一种在ASP中用服务器端JScript脚本实现的中英文字体的自动选择方法。利用该方法不仅可以轻松达到Word中的效果,而且能使客户端输出的HTML源代码更加紧凑简洁。源代码及简要说明如下:
<%@ Language=JScript %>
<html>
<head>
<meta http-equiv=“Content-Type” content=“text/html; charset=gb2312”>
<meta name=“Author” content=“contion”>
<title>自动选择字体脚本测试页</title>
<script language=“JScript” runat=“Server”> /*如果要在客户端HTML(即普通HTML文件)中使用本函数,请将“language”设置为“JavaScript”,并将runat=“Server”去掉*/
//自动选择字体函数
function cWrite(strPut)
{
var strInput,intLength,blnTagClosed,blnHtmlTags,strWrite,chrAti,argv,argcstrClass;
strInput=‘ ’+strPut;
intLength=strInput.length;
blnTagClosed=true;
blnHtmlTags=false;
strWrite=‘ ’;
argv=cWrite.arguments;
argc=argv.length;
strClass=(argc>1)?argv[1]:‘en’; /*如果不带参数,那么默认的英文样式为本页CSS样式定义的en。CSS样式表的定义可参考下文的代码。*/
/*如果输入字符串为“空”则返回空值*/
if(strPut==null) return strWrite;
for(var i=0;i<intLength;i++)
{
chrAti=strInput.charAt(i);
if(strInput.charAt(i-1)==‘>’ && blnHtmlTags==true) blnHtmlTags=false; /* 碰到“>”,则认为当前字符不是HTML标记。HTML标记也是英文字符,但对它们进行字体设置是没有任何意义的,因为HTML标记本身不会被显示。 */
/* 碰到“<”,HTML标记开始 */
if(chrAti==‘<’) blnHtmlTags=true;
if(chrAti!=‘ ’)
{
//过滤空格
if(ifWesternChr(chrAti) && !blnHtmlTags)
{
/*如果是英文字符并且不在HTML标记之内*/
if(blnTagClosed){ /* 只有在<font>……</font>标记已经完整的情况下才能再添加<font>修饰 */
strWrite+=‘<font class=“‘+str
Class+’”>’+chrAti;
blnTagClosed=false;
}
else if(!blnTagClosed) strWrite+=chrAti;
}
else{
if(!blnTagClosed)
{
strWrite+=‘</font>’+chrAti;
//将<font>标记置为“已关闭”
blnTagClosed=true;
}
else if(blnTagClosed) strWrite+=chrAti;
}
}
else strWrite+=chrAti;
}
if(!blnTagClosed) strWrite+=‘</font>’
//返回经过字体修饰的HTML字符串
return strWrite;
}
/*判断当前字符是英文字符还是中文字符*/
function ifWesternChr(chrInput)
{
var chrInput_e;
chrInput_e=escape(chrInput);
if(chrInput_e.length==(chrInput.length)*6 || chrInput==‘\r’ || chrInput==‘\n’) return false; /*只有非普通ASCII字符经过escape()函数编码之后的长度才会等于原长度的6倍,所以用这种方法可以避开内码直接判断当前字符是否为中文。*/
else return true;
}
</script>
<style>
<!-- 以下CSS样式仅作参考。注意:en是程序默认的英文字体样式类,所以一定要定义。
body{ color: #000080;
font-family: 宋体; font-size: 12pt }
.en { color: #ff0000;
font-family: “Times New Roman”;
font-weight: bold;
font-style: italic;
font-size: 12pt }
-->
</style>
</head>
<body bgcolor=“#FFFFFF”>
<%
/*下面是一个调用例子,您可以参考下面的方式调用上边编写的函数。在HTML文件中引用时要注意将本例中所有的ASP函数、对象替换为相应的客户端脚本的形式,如“Response.Write”应该替换为“document.write”*/
var strWrite;
strWrite=‘在本测试页中,所有半角字符的字体都被设置为“Times New Roman”,并以红色粗斜体显示。’;
strWrite+=‘当然,这仅仅是为了测试方便和醒目,您应该自己定义合适的字体。’;
strWrite+=‘如:“Computer”、“World Wide Web”等等,“?”是英文问号,“,”是英文逗号,’;
strWrite+=‘“1234567890”为本字体的数字显示样式。这样看起来中文省略号“……”与英文省略号’;
strWri