Последние записи
- Функция рисования для печати на принтере ScanLine
- Функция CharInSet (множества) не работает для русских букв
- Вывод изображений на печать
- Посимвольный перебор строки (сравнение скорости двух методов)
- png в ico с прозрачностью и разными разрешениями
- Автоматическое создание Proxy-файлов видео с камеры DJI Osmo Action 5 Pro для Vegas
- Поиск значения и вставка текса
- Движение image по форме
- Звук в Delphi
- Экранная лупа (линза)
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
25th
Май
Функция CharInSet (множества) не работает для русских букв
Posted by obzor under Delphi
Я заметил, что в современных версиях Delphi (у меня 10.3) строковый тип юникодный (2-байтовый).
Функция CharInSet не работает для русских букв.
procedure TForm1.Button1Click(Sender: TObject);
var s, s1: string;
i: integer;
begin
//s:='ABCabc АБВабвЁё';
s:=Edit1.Text;
Memo1.Clear;
for i:=1 to Length(s) do
begin
s1:=Format('%s - %d - ', [s, Ord(s)]);
if CharInSet(s, ['А'..'Я', 'а'..'я', 'Ё', 'ё']) then
//if s in ['А'..'Я', 'а'..'я', 'Ё', 'ё'] then
s1:=s1+'русская буква' else
s1:=s1+'другой символ';
Memo1.Lines.Add(s1);
end;
end;
Аналогично не работает такая конструкция
if s in ['А'..'Я', 'а'..'я', 'Ё', 'ё'] then
Ситуацию можно исправить, если вместо s написать AnsiString(s)[1].
Вопрос: есть ли другая подобная функция проверки русских символов?
Вообще решение зависит от того, что хотим получить в итоге. Если просто проверить букву на русская / нерусская, то можно сделать так:
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
s, s1: string;
begin
s := Edit1.Text;
ListBox1.Items.Clear;
for i := 1 to Length(s) do begin
s1 := s + ' - ';
if (s >= 'А') and (s <= 'Я') or
(s >= 'а') and (s <= 'я') or
(s = 'Ё') or (s = 'ё')
then s1 := s1 + 'русская буква'
else s1 := s1 + 'другой символ';
ListBox1.Items.Add(s1);
end;
end;
Если диапазонов больше, то можно через case:
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
s, s1: string;
begin
s := Edit1.Text;
ListBox1.Items.Clear;
for i := 1 to Length(s) do begin
case s of
'А'..'Я', 'а'..'я', 'Ё', 'ё': s1 := 'русская буква';
'A'..'Z', 'a'..'z': s1 := 'английская буква';
'0'..'9': s1 := 'цифра';
else s1 := 'другой символ';
end;
ListBox1.Items.Add(s + ' - ' + s1);
end;
end;
Если же надо проверить принадлежность символа произвольному набору (множеству), то можно через string и Pos:
procedure TForm1.Button1Click(Sender: TObject);
const
AlphaSet = 'qwertyйцукен';
var
i: Integer;
s, s1: string;
begin
s := Edit1.Text;
ListBox1.Items.Clear;
for i := 1 to Length(s) do begin
if Pos(s, AlphaSet) > 0
then s1 := 'принадлежит множеству'
else s1 := 'не принадлежит множеству';
ListBox1.Items.Add(s + ' - ' + s1);
end;
end;
Либо более быстрый способ через StrScan:
if StrScan(PChar(AlphaSet), s) <> nil
then s1 := 'принадлежит множеству'
else s1 := 'не принадлежит множеству';
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту

пеллетные котлы

Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)


