Ответ 1
CharInSet бесполезен для символов выше 255. В вашем случае вы должны использовать
case C of
'S','س' : ShowMessage('Found');
end;
Я обновил приложение от 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
, даже я выбрал edt1.Text 1 с AnsiChar он всегда не работает арабскими буквами.
Делает что-то не так, или это не работает CharInSet
?, или что ошибка в CharInSet
?
UPDATE:
Мой великий друг Issam Ali предложил другое решение, которое отлично срабатывало:
If CharinSet(AnsiString(edt1.Text)[1],['S','س']) then
CharInSet бесполезен для символов выше 255. В вашем случае вы должны использовать
case C of
'S','س' : ShowMessage('Found');
end;
Это происходит потому, что set of char
структурированный тип (ограниченный максимум 256 элементами) не поддерживает Unicode вообще. То есть любые символы Ord(ch) > High(AnsiChar)
, усеченные в конструкторе set, и предупреждение 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');
Кроме того.
Множестваограничены порядковыми значениями 256 элементов. Поэтому AnsiChar подходит и (Unicode) Char не подходит. Вы можете использовать CharInSet для переноса до Unicode версий Delphi в версии Unicode. Из-за установленного ограничения наборы не очень полезны с Chars.
Причина этого заключается в том, что наборы реализованы как битмаски. Вы можете реализовать свою собственную версию набора. Например:
type
TSet<T> = class
public
procedure Add(const AElem: T);
function InSet(const AElem: T): Boolean;
end;
Установили ли вы кодировку исходного файла UTF-8
(щелкните правой кнопкой мыши, чтобы открыть контекстное меню)? (По умолчанию используется ANSI iirc, который не работает.)
Используйте TCharHelper.IsInArray следующим образом:
if Edit1.Text[1].IsInArray(['S','س']) then
ShowMessage('Found')
else
ShowMessage('Not Found');