CharInSet不使用非英文字母?

时间:2010-11-21 10:12:49

标签: delphi unicode delphi-2010 arabic

我已经从Delphi 2007更新了一个应用程序到Delphi 2010,一切都很顺利,除了一个编译正常但不能正常工作的声明:

If Edit1.Text[1] in ['S','س'] then 
  ShowMessage('Found')
else
  ShowMessage('Not Found')

但是,我知道不会,所以我改为CharInSet

If CharinSet(Edit1.Text[1],['S','س']) then
  ShowMessage('Found')
else
  ShowMessage('Not Found')

但是当字符串为س时它永远不会起作用,但始终与S一起使用,即使我使用AnsiChar转换edt1.Text 1它也始终不能使用阿拉伯字母。

我做错了什么,或者不是CharInSet的工作方式?,或者这是CharinSet中的错误?

更新

我的好朋友Issam Ali提出了另一个解决方案,它的工作正常:

  If CharinSet(AnsiString(edt1.Text)[1],['S','س']) then

5 个答案:

答案 0 :(得分:17)

对于255以上的字符,CharInSet无效。在您的情况下,您应该使用

  case C of
    'S','س' : ShowMessage('Found');
  end;

答案 1 :(得分:3)

这是因为set of char结构化类型(最多限制为256个元素)根本不支持Unicode。也就是说,正在发出在集合构造函数中截断的任何字符Ord(ch) > High(AnsiChar),并警告W1061将WideChar缩小为AnsiChar。查看以下测试用例:

  { naturally, fails, emits CharInSet() suggestion }
  Result := 'س' in ['S','س'];

  { fails because second argument is set of AnsiChar }
  Result := CharInSet(
    'س',
    ['S','س']
  );

  { workaround for WideChar in AnsiCharSet, fails }
  Result := WideStrUtils.InOpSet(
    'س',
    ['S','س']
  );

  { a syntactical workaround, which finally works }
  Result := WideStrUtils.InOpArray(
    'س',
    ['S','س']
  );

  if Result then
    ShowMessage('PASS')
  else
    ShowMessage('FAIL');

答案 2 :(得分:2)

另外。

集仅限于256个元素的序数值。所以AnsiChar适合和(Unicode)Char不适合。 您可以使用CharInSet将Delphi的unicode版本移植到unicode版本。由于设置限制,使用Chars设置不再非常有用。

背后的原因是,集合实现为位掩码。您可以自由地实现自己的版本集。例如:

type
  TSet<T> = class 
  public
    procedure Add(const AElem: T);
    function InSet(const AElem: T): Boolean;
  end;

答案 3 :(得分:1)

您是否已将源文件的编码设置为UTF-8(右键单击以打开上下文菜单)? (默认为ANSI iirc,这不起作用。)

答案 4 :(得分:1)

使用TCharHelper.IsInArray,如下所示:

if Edit1.Text[1].IsInArray(['S','س']) then 
  ShowMessage('Found')
else
  ShowMessage('Not Found');