您的位置:首页 > 编程语言 > Delphi

在 Delphi 中判断一个字符是中文的方法

2017-01-25 00:12 281 查看
由于 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 源码公开,让所有高手来改进并增加新的功能,到时候您可一定要来呀!
http://www.cnblogs.com/myqiao/archive/2005/08/29/225527.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: