如何判断一个字符串中是否包括中文?(100分)

  • 主题发起人 主题发起人 lijuan
  • 开始时间 开始时间
L

lijuan

Unregistered / Unconfirmed
GUEST, unregistred user!
var
Message : pChar ;
begin
GetMem(Message,256);
Strcopy('1234567890!@#$%^&amp;*()_+=-|/qwertyuiop[]{}';:"lkjhgfdsazxcvbnm,./?><中国') ;
//如何判断上面的字符串中有中文
FreeMem(Message) ;
end ;
 
不考虑效率最简单的方法是:
var
s: string;
ws: widestring;
begin
s := '1234567890!@#$%^&amp;*()_+=-|/qwertyuiop[]{}';:"lkjhgfdsazxcvbnm,./?><中国';
ws := s;
if length(s)<>length(ws) then
showmessage('有中文');
end;
 
最简单的办法是:
if length(yourstring)-length(widestring(yourstring)) > 0 then
Showmessage('这个字串中包含中文');
 
进行扫描,如果有字符的序号大于等于$a1,则说明含有中文字符
 
可以通过把字符转换为ASCII码数值来进行判断,Ord()函数就可以把字符转换为对应的数值,值33-126为键盘可使用字符,值127以上的为未知字符,即为汉字
 
我对此也有过研究,没有这么简单,看你用那种汉字编码,有字符值是否大于176,160,128,40等几种判断方式。
 
字节的高位等于1, chr and $8 = $8。
好久没弄了,不知道对不对。
 
看它的ASCII是不是大于127,如果是,就是中文。
 
bjaman的方法应该是可以的。
 
ASCII表中大于127<255的区间还有制表符等单字节字符,不能视它们为汉字吧?汉字可是双字节呀。
还是用这个吧!
if length(yourstring)-length(widestring(yourstring)) <> 0 then
Showmessage('这个字串中包含中文')

 
bjaman的方法应该是比较简单直接的
 
这里给出一个全角字符转半角字符的例程,稍作修改就可以判断是否含有中文
function IsChnese(s:string):string;
var
nlength,i:integer;
str,ctmp,c1,c2:string;
{
在windows中,中文和全角字符都占两个字节,
并且使用了ascii chart 2 (codes 128–255)。
我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。
实际上,全角字符的第一个字节总是被置为163,
而第二个字节则是相同半角字符码加上128(不包括空格)。
如半角a为65,则全角a则是163(第一个字节)、193(第二个字节,128+65)。
而对于中文来讲,它的第一个字节被置为大于163,(
如'阿'为:176 162),我们可以在检测到中文时不进行转换。
}
begin
nlength:=length(s);
if (nlength=0) then
exit;
str:='';
setlength(ctmp,nlength+1);
ctmp:=s;
i:=1;
while (i<=nlength) do
begin
c1:=ctmp;
c2:=ctmp[i+1];
if (c1=#163) then //如果是全角字符
begin
str:=str+chr(ord(c2[1])-128);
inc(i,2);
continue;
end;
if (c1>#163) then //如果是汉字
begin
str:=str+c1;
str:=str+c2;
inc(i,2);
continue;
end;
if (c1=#161) and (c2=#161) then //如果是全角空格
begin
str:=str+' ';
inc(i,2);
continue;
end

str:=str+c1;
inc(i);
end;
result:=str;
end;
 
function GBOffset(value: string): integer;
begin
if length(value) >= 2 then
Result := (Ord(value[1]) - 161) * 94 + (Ord(value[2]) - 161)
else
Result := -1;
end;

function BIG5Offset(value: string): integer;
begin
Result := -1;
if length(value) >= 2 then
begin
if (Ord(value[2]) >= 64) and (Ord(value[2]) <= 126) then
Result := (Ord(value[1]) - 161) * 157 + (Ord(value[2]) - 64);
if (Ord(value[2]) >= 161) and (Ord(value[2]) <= 254) then
Result := (Ord(value[1]) - 161) * 157 + 63 + (Ord(value[2]) - 161);
end
end;

function WordToString(value: Word): string;
begin
Result := Chr(Hi(value)) + Chr(Lo(Value));
end;

function isBIG5(value: string): Boolean;
begin
if (length(value)>=2) then
begin
if (value[1] < #161) then
Result := false
else
if ((value[2] >= #64) and (value[2] <= #126)) or ((value[2] >= #161) and (value[2] <= #254)) then
Result := true
else
Result := false
end
else
Result := false
end;

function isGB(value: string): Boolean;
begin
if (length(value)>=2) then
begin
if (value[1] <= #161) and (value[1] >= #247) then
Result := false
else
if (value[2] <= #161) and (value[2] >= #254) then
Result := false
else
Result := true
end
else
Result := true;
end;
 
后退
顶部