由于 Delphi2005 支持中文标识符,在编写 PASCAL 词法分析器的过程中遇到了这个问题,经过多次试验找到了解决方案,至今未发现问题。
代码如下:
//判断字符是否是汉字 function IsHZ(ch: WideChar): boolean; var i:integer; begin i:=ord(ch); if( i<19968) or (i>40869) then result:=false else result:=true; end; |
2005年1月28日:感谢滚龙的指点,已将代码改写如下:
//判断字符是否是汉字 function TForm1.IsHZ(ch: Char): boolean; begin //返回值为 0 的时候为单字节字符,返回值为 1 的时候为多字节字符 if(ord(bytetype(ch,1))=1) then result:=true else result:=false; end; |
2005年1月31日:谢谢滚龙再次赐教,代码已收藏!
//┏━━━━━━━━━━━━━━┓ //┃代码着色:CodeColor v1.0 ┃ //┃来自:悄然无声的 Blog ┃ //┗━━━━━━━━━━━━━━┛ //判断字符是否是汉字 function IsMBCSChar(const ch: Char): Boolean; begin Result := (ByteType(ch, 1) <> mbSingleByte); end; |
一些感想:这应该就是正规军和游击队之间的差别了,正规军打仗讲究全局、战法、配合和协同;游击队战场狭小,眼界有限,条件落后,为了打鬼子经常用一些土办法。还好现在有了网络,要不然像我这样的业余爱好者就真的只能闭门造车了。
本文引用通告地址: http://blog.csdn.net/wlnh_2004/services/trackbacks/270866.aspx
[点击此处收藏本文]
发表于 2005年01月27日 6:11 PM
需要 登录 才可以评价。
顺便说一下,你的代码不够明确和简练,而且风格不太好,在调试或查阅的时候会带来麻烦。
下面是我针对这个功能写的函数,仅供参考!
function IsMBCSChar(const ch: Char): Boolean;
begin
Result := (ByteType(ch, 1) <> mbSingleByte);
end;
这个函数不是判断字符是否为汉字,而是判断数否为多字节字符的一部分。这不仅适用于汉字,也适用于比如日文、韩文等。我想你的CodeColor也不希望仅仅局限于处理汉字吧~
这虽然是很不起眼的一点,但是日后查看代码或者给他人查看代码,别人往往会直接通过注释来了解这个函数的功能,那么就会比较直观的犯一个错误:这个函数只能处理汉字。
可能是我比较追求完美,要求比较苛刻,希望别见怪!因为我觉得中国软件质量要提高,就得从这些点点滴滴开始积累!
能得到你这样的高手指点倍感荣幸!说起第一个函数的来历你别笑我,我把编码 1 到 100000 的字符全列了出来,从中间找到连续汉字的区间,所以我说是“通过实验找到了解决方法”。
您可能无法理解一个业余编程者的遇到问题时的窘况。当时这个问题要是不解决,我的程序就不能正常工作,所以我只能采取“不管白猫黑猫,先给我抓住老鼠再说”的方法。
通过您的几次指点,我已经决定把 CodeColor 源码公开,让所有高手来改进并增加新的功能,到时候您可一定要来呀!