代码之家  ›  专栏  ›  技术社区  ›  Mohammed Nasman

CharInSet不处理非英语字母?

  •  16
  • Mohammed Nasman  · 技术社区  · 13 年前

    我更新了一个从Delphi2007到Delphi2010的应用程序,一切都很好,除了一个编译得很好但不起作用的语句:

    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 ,甚至我也投了edt1.Text 1 使用AnsiChar,它总是不能使用阿拉伯字母。

    我做错了什么,或者不是这样 查林斯特 作品?,或者这是一个错误 CharinSet ?

    更新:

    我的好朋友 Issam Ali 已经提出了另一个解决方案,效果很好:

      If CharinSet(AnsiString(edt1.Text)[1],['S','س']) then
    
    5 回复  |  直到 13 年前
        1
  •  17
  •   kludg    13 年前

    对于255以上的角色,CharInSet是无用的。在你的情况下你应该使用

      case C of
        'S','س' : ShowMessage('Found');
      end;
    
        2
  •  3
  •   Free Consulting    13 年前

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

      { 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');
    
        3
  •  2
  •   Toon Krijthe    13 年前

    此外。

    集合限制为256个元素的序数值。所以AnsiChar适合而(Unicode)Char不适合。 您可以使用CharInSet将Delphi的pre-unicode版本移植到unicode版本。由于集合的限制,集合在char中不再非常有用。

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

    type
      TSet<T> = class 
      public
        procedure Add(const AElem: T);
        function InSet(const AElem: T): Boolean;
      end;
    
        4
  •  1
  •   mjn anonym    13 年前

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

        5
  •  1
  •   mas_oz2k1    7 年前

    使用 TCharHelper.IsInArray 具体如下:

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