中文字符在集合中的判断问题
主要问题是你的p:PChar 是PWideChar 而字符集 支持的PAnsiChar ,字符集里面的汉字会被截取前一个字符,就变成你是取了双字节和单字节去判断的,所以不对。 上面的代码我也只取了一半去判断的,显示的值是双字节的。
[解决办法]
虽然没用过xe4,5等等,但是这段程序明显是有问题的!
if p1[i-1] in [' ', 'a'..'z', '.', '中', '文', '。'] then s := 'in true';
改为
if p1[i-1] in [' ', 'a'..'z', '.', '中', '文', '。'] then s := 'in true' else s := 'not in';
你看看还是你那个结果不
[解决办法]
因为集合最多256个元素.而中文属于Unicode,所以字符集合只是ANSI的.
不过可以借助子界类型.
if p^ in [' ', 'a'..'z', '.', '中', '文', '。'] then s := 'in true';
改为
case p^ of
' ', 'a'..'z', '.', '中', '文', '。':
s := 'in true';
end;
[解决办法]
g103 103 in true
o111 111 in true
o111 111 in true
d100 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; 。