在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函數處理。詳細使用見IsDBCSLeadByte函數博文.