奇怪的汉字和判断。。。晕了(50分)

  • 主题发起人 主题发起人 jacklee
  • 开始时间 开始时间
J

jacklee

Unregistered / Unconfirmed
GUEST, unregistred user!
这个是判断是否是汉字的自定义函数
function Tform1.ishanzi(hz:string):boolean;
var i:integer;
begin
result:=false;
hz:=trim(hz);
for i:=1 to length(hz) do
begin
if (ord(hz)<127) or ((hz> #$a1) and (hz<#$a9 )) then
result:=true;
end;
奇怪的是“单”这个字竟然判断为不是汉字。你说晕不晕啊!?
 
这样来:
function Tform1.ishanzi(hz:widestring):boolean;
var
i:integer;
begin
result := false;
hz :=trim(hz);
for i := 1 to length(hz) do
if (ord(hz)<127) or ((hz> #$a1) and (hz<#$a9 )) then
result:=true;
end;
 
中文字是雙字節的,所以要用hz:widestring!!
 
不是有个函数可以判断当前字节是什么的吗?
========
Croco (2000-4-26 16:1)
function ByteType(const S: string; Index: Integer): TMbcsByteType;
S: 字串
I: 索引
Result:
mbSingleByte: Ascii
mbLeadByte: 汉字头半字
mbTrailByte: 汉字后半字
e.g.
ByteType('c字', 1) = mbSingleByte
ByteType('c字', 2) = mbLeadByte
ByteType('c字', 3) = mbTrailByte
 
实现过程如下:
function ByteType(const S: string; Index: Integer): TMbcsByteType;
begin
Result := mbSingleByte; //默认为英文字符
if SysLocale.FarEast then //操作系统是亚洲版本
Result := ByteTypeTest(PChar(S), Index-1);
end;

function ByteTypeTest(P: PChar; Index: Integer): TMbcsByteType;
var
I: Integer;
begin
Result := mbSingleByte;
if (P = nil) or (P[Index] = #$0) then Exit;
if (Index = 0) then
begin
if P[0] in LeadBytes then Result := mbLeadByte;
end
else
begin
I := Index - 1;
while (I >= 0) and (P in LeadBytes) do Dec(I);//这里我还想不通为什么要用循环,而不是直接判断
if ((Index - I) mod 2) = 0 then Result := mbTrailByte
else if P[Index] in LeadBytes then Result := mbLeadByte;
end;
end;
 
就是widestring解决问题。看来帖子不在于长而在于精啊![:D]
 
jacklee,下面这句话是不完全准确的!
>>中文字是雙字節的,所以要用hz:widestring!
 
试了一下,这样可以:
length(yourstring) - length(widestring(yourstring)) = 汉字个数
2*length(widestring(yourstring)) - length(yourstring) = 英语个数
 
晕,我第一个答对,楼主却一分没给,
楼上两位的了分,还另开帖开战!
 
后退
顶部