首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

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

2013-10-19 
中文字符在集合中的判断问题主要问题是你的p:PChar是PWideChar而字符集 支持的PAnsiChar ,字符集里面的汉

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



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

[解决办法]


主要问题是你的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; 。

热点排行