169 похожих чатов

Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i:

Integer;
ValidChars: AnsiString;
begin
ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&?*()-_';

Result := False;
for i := 1 to Length(ValidChars) do
begin
if Ord(ch) = Ord(ValidChars[i]) then
begin
Result := True;
Break;
end;
end;
end;

Передаю в неё символ:
IsValidChar('и');

Ругается: Error: Incompatible type for arg no. 1: Got "Constant String", expected "Char"
Если передаю латиницей, то все ок. Что не так делаю?

44 ответов

10 просмотров

утф8чар и есть строка

ValidChars у тебя для однобайтных символов

Евгений- Автор вопроса
Renat Suleymanov
ValidChars у тебя для однобайтных символов

Но в таком случае пусть я получаю всегда False. Но чем же не нравится входному параметру один символ?

если винда, можно попробовать сохранить исходник в ansi кодировке. тогда есть шанс насколько помню. если 'и' будет в 1251

Если тебе нужно просто просканировать строку UTF8 на валидные Ansi символы, то можешь сделать так: function IsValidString(const S: String; ValidChars: TAnsiCharSet): Boolean; var i: Integer; begin if S=EmptyStr then Exit(False); i:=0; Result:=True; while Result and (i<Length(S)) do begin if not (S[i+1] in ValidChars) then Result:=False; Inc(i); end; end;

Renat Suleymanov
Если тебе нужно просто просканировать строку UTF8 ...

Я так понимаю у него там надо или через переменную передавать параметр, или const дописать у параметра

Евгений- Автор вопроса
Nik
Я так понимаю у него там надо или через переменную...

Задумка такая, что я при вводе в поле "Пароль" буду проверять символы, доступны ли они из того списка, который указан в функции. И она при каждом вводе KeyPress будет это проверять.

Евгений
Задумка такая, что я при вводе в поле "Пароль" буд...

если в списке только латиница и символы "байтовой" части uff8 то както так

Евгений
Задумка такая, что я при вводе в поле "Пароль" буд...

Не понятно, зачем вы вообще ограничивается юзера в пароле

Евгений- Автор вопроса
Евгений- Автор вопроса
Hemul GM
Не понятно, зачем вы вообще ограничивается юзера в...

Вопрос хороший конечно. Но тогда переведем это в "Проверка логина". Там будет идентичная проверка и русские символы точно недопустимы

Евгений
Вопрос хороший конечно. Но тогда переведем это в "...

В fmx можно для Edit указать доступный набор символов) В противном случае, можно использовать for var Char in AllowedChars do if not text.Contains(Char) then ...

Евгений- Автор вопроса
Hemul GM
В fmx можно для Edit указать доступный набор симво...

До FMX я пока не дорос ещё, к сожалению... Там с БД нужен API.

Евгений- Автор вопроса

Про обезьянку я так понял он имел ввиду)

Евгений
Вопрос хороший конечно. Но тогда переведем это в "...

У меня на Сохранить проверяется, при этом юзеру пишется заранее, что проверяется

Евгений- Автор вопроса
Катерина Свиридова
У меня на Сохранить проверяется, при этом юзеру пи...

Типа подсказка под полес, что вводите такие то символы?

Заменить объявления на WideString и WideChar, убедиться, что модуль в кодировке utf8 и указана директива codepage utf8 в начале модуля.

Ivan Petrov
Чуть не так описание бы)

Не понятно что вводить? Могу ятей понаставить

Катерина Свиридова
Не понятно что вводить? Могу ятей понаставить

Ну просто взять второе предложение, оно противоречит первому. "Должна присутствовать хотя бы одна цифра" уже расширяет первое условие

Ivan Petrov
Символ символ)

Иван, можешь мне мозг парить. Но заказчик удовлетворен и остальное пофиг)

Евгений
Вопрос хороший конечно. Но тогда переведем это в "...

```pascal function CheckASCII(const s: utf8String): Boolean; var i: Integer;

Евгений
Вопрос хороший конечно. Но тогда переведем это в "...

function IsOnlyASCII(const s: utf8String): Boolean; var i: Integer; begin Result:=False; for i:=1 to Length(s) do if not (Ord(s[i]) in [$21..$7f]) then Exit; Result:=True; end;

Евгений- Автор вопроса
Serg
function IsOnlyASCII(const s: utf8String): Boolean...

Буду дома и обязательно проверю. Спасибо!

Евгений
Буду дома и обязательно проверю. Спасибо!

но так-то всякие скобки в логине тоже не нужны, верно?

Евгений
Буду дома и обязательно проверю. Спасибо!

вероятно, достаточно набора [0-9A-Za-z_.]? if not (s[i] in ['0'..'9', 'A'..'Z', 'a'..'z', '_', '.']) then

Евгений- Автор вопроса
Serg
вероятно, достаточно набора [0-9A-Za-z_.]? if not...

Ну и ещё там несколько символов. !#%&_?

Евгений
Ну и ещё там несколько символов. !#%&_?

в логине? ну тогда добавьте в условие

Евгений- Автор вопроса
Serg
вероятно, достаточно набора [0-9A-Za-z_.]? if not...

function IsOnlyASCII(const s: utf8String): Boolean; var i: Integer; begin Result:=False; for i:=1 to Length(s) do if not (Ord(s[i]) in [$21..$7f]) then Exit; Result:=True; end; procedure TfrmUsAE.edtUserNameKeyPress(Sender: TObject; var Key: Char); begin if IsOnlyASCII(UTF8Encode(Key)) then begin ShowMessage('!'); end; end; Этот вариант вообще не работает, даже с цифрами)))

Евгений
function IsOnlyASCII(const s: utf8String): Boolean...

ну тут имя функции стоит поменять на что-то более точное, там же не "почти весь" ASCII теперь

Можно проще: function IsValidChar(ch: UTF8Char): Boolean; var   i: Integer;   ValidChars: AnsiString; begin   ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&?*()-_'; if Pos(ch, ValidChars) then Exit(True) else Exit(False); end; Правда не проверял)

Евгений- Автор вопроса
Kirill Filippenok
Можно проще: function IsValidChar(ch: UTF8Char): B...

Вот у меня практически один в один был код на Delphi, а на Лазаре не сработал и стал возиться с кодировками.

Kirill Filippenok
Можно проще: function IsValidChar(ch: UTF8Char): B...

Опять if true then exit(true) else exit(false); :( Зачем? Result :=Pos(ch, ValidChars)<>0;

Kirill Filippenok
Ещё лучше 👍

Но тут опять будет нюанс: если в ValidChars только верхняя половина ASCII, то можно бежать по строке побайтово. Но если захочется добавить символов вне этого диапазона, по проверяемой строке придется бежать с учётом длины мультибайтных символов, иначе в общем случае возможны ложные срабатывания

Serg
Но тут опять будет нюанс: если в ValidChars только...

Pos умеет работать и с UnicodeString и WideString и AnsiString. Причем тип строки и символа могут отличаться

Kirill Filippenok
Pos умеет работать и с UnicodeString и WideString ...

И? Ответ был не про Pos, а про исходную строку, из нее же берут по символу для проверки. Вот если внутри ValidChars... и далее по тексту выше

Похожие вопросы

Обсуждают сегодня

Чтобы перехватить все нажимания буков на форме, надо хук ставить? Пробовал на форме ОнКейДаун, оно ловит клаву если фокус не на компоненте с вводом текста
Serjone
15
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
Всем привет! вывожу на общей стр дочерние ресурсыв каждом ресурсе галерея, и первая фотка должна выводиться на общей [!DocLister? &prepare=photo !]
Alekso
12
А можно вопрос? Мне сегодня сказали что у меня функция (которая просто заполняет массив значениями) не правильная void Full(double * arr, int n) { for (int i = 0; i < n; i...
† C E †
7
День добрый, подскажите пожалуйста, есть ли какой-то способ сказать ребару не компилировать определённое приложение? Всю доку их перечиатл ничего подобного не нашёл
Кирилл
14
Народ! Впервые клиенту пришло письмо от РКН, у вас, дескать, есть яндекс метрика, а нигде не написано, что вы ее юзаете. Никто не сталкивался?
Sasha Beep
10
Добрый вечер. Хочу чтобы у меня в классе поле было функцией, которая возвращает строку. Делаю так: interface ... TGetOutPath = function : String of object; ... protec...
Kirill Filippenok
12
Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
кто то в лазаре смог отключить в HeapTrc отчёт об утечках если они не обнаружены? SetHeapTraceOutput('leak'); не помогает, но и не ругается 😞 лазарь 3.4
Mikhail Tchervonenko
7
Здравствуйте, хочу сделать HelloWorld в консоли Дельфи, но функция API ничего не выводит, что я делаю не так? program Hello; {$APPTYPE CONSOLE} uses System.SysUtils, WinAPI.Wi...
Sergey Vinogradov
20
Карта сайта