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 ответов

38 просмотров

утф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... и далее по тексту выше

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

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

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Oh sorry did you want it in Gunter's chains?
Martin Rys
15
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
Карта сайта