在Delphi中一个汉字占两个字节,各种字符串处理函数,直接处理字符串中汉字时经常会发生乱码或不显示。我在处理时也是弄了半天,到处找资料,一下是找到的几种处理方法。在Delphi7下测试通过。
一.中文所用的字符全是双字节字符,英文所用的字节全是单字节字符,也就是mbSingleByte。本实例是用ByteType()函数返回字符串指定位置上的字符,如果不是mbSingleByte,则表示为双字节字符。主要代码如下:
procedure TForm1.Button1Click(Sender: TObject); var s,s1: String; i : Integer; begin s := Edit1.Text; i := 0; while i<Length(s) do begin if (ByteType(S,i) <> mbSingleByte) then begin s1 := s1+ Copy(s,i,2)+' '; i := i+2; end else i:= i+1; end; Label2.Caption := Trim(s1); end;
二.本实例是用Length()函数来获取字符串的长度,用Ord()函数来获取每个字符的ASCII码,当ASCII码的值大于$7F时,表示该字符是汉字的前一个字节,并用Copy()函数来获取当前的汉字。主要代码如下:
procedure TForm1.Button2Click(Sender: TObject); var str,s,sj: String; i: integer; begin str := trim(Edit1.Text); i := 0; while i< Length(str) do begin if ord(str[i]) > $7F then begin s := Copy(str,i,2); sj :=sj+ '"'+s+'"'; i := i+2; end else i:=i+1; end; Label2.Caption := '在字符串中含有汉字'+sj; end; 三用widestring类型。widestring处理汉字时汉字按一个字符算。代码如下:
procedure TForm1.Button3Click(Sender: TObject); var str:string; badword,filtstr:widestring; filtcount,i:integer; msg:widestring; begin msg:=edit1.Text; for i:=1 to length(msg) do begin if Pos((msg[i]),filtstr)<>0 then begin badword:=badword+msg[i]+','; msg:=StringReplace(msg,msg[i],'*', []); filtcount:=filtcount+1; end; end; showmessage(msg); end;
四.用Windows.IsDBCSLeadByte函
|