悄然无声的 Blog
不是我不明白,这世界变化快!

        由于 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


需要  登录  才可以评价。       

滚龙 发表于2005-01-28 7:50 PM  
请参看StrUtils.ByteType函数

滚龙 发表于2005-01-30 10:21 PM  
你的函数有问题,如果传入的是双字节的后面一个,岂不是被误认为英文了?

顺便说一下,你的代码不够明确和简练,而且风格不太好,在调试或查阅的时候会带来麻烦。

下面是我针对这个功能写的函数,仅供参考!
function IsMBCSChar(const ch: Char): Boolean;
begin
Result := (ByteType(ch, 1) <> mbSingleByte);
end;

滚龙 发表于2005-01-31 9:02 PM  
还有一个问题,你的注释!

这个函数不是判断字符是否为汉字,而是判断数否为多字节字符的一部分。这不仅适用于汉字,也适用于比如日文、韩文等。我想你的CodeColor也不希望仅仅局限于处理汉字吧~

这虽然是很不起眼的一点,但是日后查看代码或者给他人查看代码,别人往往会直接通过注释来了解这个函数的功能,那么就会比较直观的犯一个错误:这个函数只能处理汉字。

可能是我比较追求完美,要求比较苛刻,希望别见怪!因为我觉得中国软件质量要提高,就得从这些点点滴滴开始积累!

悄然无声 发表于2005-01-31 11:17 PM  
TO 滚龙:
能得到你这样的高手指点倍感荣幸!说起第一个函数的来历你别笑我,我把编码 1 到 100000 的字符全列了出来,从中间找到连续汉字的区间,所以我说是“通过实验找到了解决方法”。

您可能无法理解一个业余编程者的遇到问题时的窘况。当时这个问题要是不解决,我的程序就不能正常工作,所以我只能采取“不管白猫黑猫,先给我抓住老鼠再说”的方法。

通过您的几次指点,我已经决定把 CodeColor 源码公开,让所有高手来改进并增加新的功能,到时候您可一定要来呀!

posted on 2005-08-29 19:32  左洸  阅读(5417)  评论(1编辑  收藏  举报