16,748
社区成员
发帖
与我相关
我的任务
分享
procedure TForm1.btn1Click(Sender: TObject);
var
s: string;
p: PChar;
begin
p := PChar('good. 有问题。');
while p^ <> #0 do
begin
s := '';
if p^ in [' ', 'a'..'z', '.', '中', '文', '。'] then s := 'in true';
mmo1.Lines.Add(p^ + Chr(9) + IntToStr(Ord(p^)) + Chr(9) + s);
inc(p);
end;
end;
g 103 103 in true
o 111 111 in true
o 111 111 in true
d 100 100 in true
. 46 46 in true
32 32 in true
有 9 26377 not in
问 238 38382 not in
题 152 39064 not in
。 2 12290 not in
procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
p1: PAnsiChar;
p2: PwideChar;
i,j:integer;
Str1,Str2:String;
begin
Str1:= 'good. 有问题。';
j:=length(Str1) ;
for I := 1 to j do
begin
Str2:=Copy(Str1,i,1) ;
p1 := PAnsiChar(Str2);
p2 := PWideChar(Str2);
s := '';
if p1[0] in [' ', 'a'..'z', '.', '有', '问','题', '。'] then s := 'in true' else s := 'not in';
memo1.Lines.Add(p2[0] + Chr(9) +IntToStr(Ord(p1[0])) +' ' + IntToStr(Ord(p2[0])) + Chr(9) +' '+ s);
end;
end;
改了下代码,结果如上。之前代码的P1取值是不对的。现在我把每个字符的分别取了Ansichar 和WideChar 出来,比如:
‘有’ : AnsiChar 是09(9) 而WideChar 是6709(26377)
‘问’ : EE(238) 95EE(38382)
‘题’ : 98(152) 9898(39064)
‘。’ : 02(2) 3002(12290)
另外刚看到是有警告的:
[dcc32 Warning] Unit1.pas(45): W1061 Narrowing given WideChar constant (#$6709) to AnsiChar lost information
汉字放字符集是种WideChar 到AnsiChar的强制转换,最后是不是我想的只保留低位可能不是我先前想的。
选择武稀松的方法吧,或者你要批量查特定字符什么的,用正则表达式的吧,引用下System.RegularExpressions; 。
P1 Ord P2 Ord
g 67 g 0067
o 6F o 006F
o 6F o 006F
d 64 d 0064
. 2E . 002E
20 0020
? D3 有 6709
? D0 问 95EE in true
? CE 题 9898
? CA 。 3002
? CC
? E2
? A1
? A3
procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
p1: PAnsiChar;
p2: PwideChar;
i,j:integer;
begin
p1 := PAnsiChar(AnsiString('good. 有问题。'));
p2 := PWideChar(AnsiString('good. 有问题。'));
j:=length('good. 有问题。') ;
s := '';
for i:=1 to j do
begin
if p1[i-1] in [' ', 'a'..'z', '.', '中', '文', '。'] then s := 'in true';
memo1.Lines.Add(p2[i-1] + Chr(9) + IntToStr(Ord(p2[i-1])) + Chr(9) + s);
end;
end;