如何判断中英文混合字符串中的汉字和字符的个数?(100分)

  • 主题发起人 主题发起人 wyz
  • 开始时间 开始时间
W

wyz

Unregistered / Unconfirmed
GUEST, unregistred user!
使用字符串长度函数可以很容易地判断纯英文或纯中文字符串的长度,但是
如何判断中英文混合字符串中的汉字和字符的个数?
 
查看String中每个一Char, 如果是大于128的,则该位和下一位就
是中文,否则就是英文。

没做过,但应该如此。
 
先将字符串定义成string,算出长度,比如是100
在将字符串定义成widestring,算出长度,比如是80
那么汉字是20个,英文是60个,解方程你该会吧?
 
如果在DELPHI中,则没有办法,只能用歪就歪的办法。

如果能连上ORACLE,那就方便了。
length代表混合长度,lengthb代表字符长度(汉字算两个)。

若那个字符串直接就是某个表的某个字段,则:
select length(a1) from a

如果仅仅是一个字符串,则:
select length('sd发射点后') from dual
 
>>如果在DELPHI中,则没有办法,只能用歪就歪的办法。
谁说的??看这里!!
procedure TForm1.Button1Click(Sender: TObject);
var a:string;
b:widestring;
chn,eng:integer;
begin
a:='asldfj按时机32432kljsadf法按时法3232sadfsa';
b:=a;
chn:=(length(a)-length(b));
eng:=length(a)-chn*2;
showmessage('汉字:'+inttostr(chn));
showmessage('英文:'+inttostr(eng));

end;
 
同意www.
如果判断是否汉字,可以这样.
function isHzChar(aCh:char):Bool;
begin
result:=aCh > char($80);
end;

字符串从头开始,如果是HzChar,计数+1,偶数,整个汉字,奇数半个汉字.
 
most easy method is:
length(yourstring)-length(widestring(yourstring))=汉字个数
2*length(widestring(yourstring))-length(yourstring)=英语个数
 
晚了一步。
 
中英文混合字串中ASCII值小于162(不包括)的是英文,否则应是某汉字的一半。
 
strEnglishSign:string = ',./<>?''";:]}[{/|=+-_)(*&amp;^%$#@!~`';
strNumberSign:string = '0123456789';
strCharSign:string= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

procedure TMDIChild.CheckFileInfo;
var
BlankNumber,ChineseCharNumber,EnglishCharNumber,
EnglishSignNumber,NumberCharNumber,OtherCharNumber:integer;
s :string;
i:integer;
begin
BlankNumber := 0;
ChineseCharNumber := 0;
EnglishCharNumber := 0;
EnglishSignNumber := 0;
NumberCharNumber := 0;
OtherCharNumber := 0;
s := Editor.Text;//Editor是TRichEdit

for i := 1 to Length(s) do
begin
if(s = ' ') then Inc(BlankNumber)
else if(integer(s) > $80) then Inc(ChineseCharNumber)
else if(Pos(s,strEnglishSign) <> 0) then Inc(EnglishSignNumber)
else if(Pos(s,strCharSign) <> 0) then Inc(EnglishCharNumber)
else if(Pos(s,strNumberSign) <> 0) then Inc(NumberCharNumber)
else Inc(OtherCharNumber);
end;

ShowMessage('中文(连中文标点符号):'+ IntToStr(ChineseCharNumber div 2)+#13#10
+ '数字字符:'+IntToStr(NumberCharNumber)+#13#10
+ '空格:'+IntToStr(BlankNumber)+#13#10
+ '英文字符:'+IntToStr(EnglishCharNumber)+#13#10
+ '英文标点:'+IntToStr(EnglishSignNumber)+#13#10
+ '不可见字符(回车、换行等):'+IntToStr(OtherCharNumber));
end;

够详细了吧。
 
可以用
IsDBCSLeadByte
判断是不是第一个字节
 
to : TOYO
此函数不是判断是否第一个字节.
例如汉字空格的内码是 #20#20, IsDBCSLeadByte(BYTE TestChar);
这两个#20按你的说法,IsDBCSLeadByte返回什末?
Remarks

Lead bytes are unique to double-byte character sets. A lead byte introduces a double-byte character. Lead bytes occupy a specific range of byte values. The IsDBCSLeadByte function uses the ANSI code page to check lead-byte ranges.

 
IsDBCSLeadByte怎么用?
 
接受www、hubdog、DreamTiger的回答,谢谢大家!
 
多人接受答案了。
 
后退
顶部