中文字符在集合中的判断有关问题

中文字符在集合中的判断问题

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 in true
o 111 in true
o 111 in true
d 100 in true
. 46 in true
  32 in true
有 26377
问 38382
题 39064
。 12290

里面的中文字符用in怎么判断不出来?请问该如何处理?

------解决方案--------------------
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;

中文字符在集合中的判断有关问题

主要问题是你的p:PChar  是PWideChar   而字符集 支持的PAnsiChar ,字符集里面的汉字会被截取前一个字符,就变成你是取了双字节和单字节去判断的,所以不对。 上面的代码我也只取了一半去判断的,显示的值是双字节的。

------解决方案--------------------
引用:
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;

中文字符在集合中的判断有关问题

主要问题是你的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;
------解决方案--------------------

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