[решено] Проверить, что строка начинается с русской буквы

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

[решено] Проверить, что строка начинается с русской буквы

Сообщение resident » 17.07.2015 14:22:33

Здравствуйте!

Как узнать, что строка начинается с определенного диапазона русских букв?
Например, с букв от "А" до "Л" независимо от регистра.
Вот такой код не работает, пишет "Ordinal expression expected"
Код: Выделить всё
RussianLanguage := (str[1] in ['А'..'Л']) or (str[1] in ['а'..'л']);

Я конечно могу сделать функцию и в ней пробегать по массиву алфавита. Но надеюсь, решение есть из коробки. (С английскими же работает.)
Последний раз редактировалось resident 17.07.2015 19:06:26, всего редактировалось 1 раз.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Как проверить, что строка начинается с русской буквы

Сообщение alexs » 17.07.2015 14:44:00

А вот так?
Код: Выделить всё
if UTF8Pos(UTF8Copy(S, 1, 1), 'АБВГабвг')>0 then
  ...
else
  ...
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Как проверить, что строка начинается с русской буквы

Сообщение alex208210 » 17.07.2015 17:39:46

десятичное представление русских символов начинается с числа 208 144 и заканчивается числом 209 145. Если десятичное представление символа входит в диапозон между этими числами, то это символ кириллицы
alex208210
постоялец
 
Сообщения: 207
Зарегистрирован: 12.05.2010 13:16:51

Re: Как проверить, что строка начинается с русской буквы

Сообщение resident » 17.07.2015 18:27:52

Спасибо, устраивающее меня решение найдено.

alexs писал(а):А вот так?

Отлично, но надо ж еще строку 'АБВГабвг' заполнять. Вручную?

alex208210 писал(а):десятичное представление русских символов начинается с числа 208 144 и заканчивается числом 209 145. Если десятичное представление символа входит в диапозон между этими числами, то это символ кириллицы

Да, стал делать во вашему принципу, благо кирилица оказалась упорядочена по алфавиту.
Но!
Откуда значения ваших чисел? Вы приводите два значения для каждого байта?
По статьям по другому:
http://mikhail.krivyy.com/2004/10/09/unicode-russian/
http://www.javaportal.ru/java/articles/ ... DK1_6.html
Для кириллицы в UNICODE отведен диапазон кодов от 0x0400 до 0x04FF

Я пока делаю так:
Код: Выделить всё
UTF8CharacterToUnicode(@str[1], CharLen)

Эта связка дает такие же значения как в статьях, т.е. от 0x0400 до 0x04FF (от 1024 до 1103).
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: [решено] Проверить, что строка начинается с русской букв

Сообщение alex208210 » 17.07.2015 19:16:54

я про utf8 говорил, у юникода свои значения

Отсюда
alex208210
постоялец
 
Сообщения: 207
Зарегистрирован: 12.05.2010 13:16:51

Re: [решено] Проверить, что строка начинается с русской букв

Сообщение resident » 17.07.2015 20:06:12

alex208210 писал(а):я про utf8 говорил, у юникода свои значения

Ок
А как вы получаете числовое значение?
В модуле LazUTF8 что-то не найду такой подходящей функции.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: [решено] Проверить, что строка начинается с русской букв

Сообщение alex208210 » 18.07.2015 00:48:48

ну например так:
Код: Выделить всё
showmessage(inttostr(ord(edit1.Text[1]))+inttostr(ord(edit1.Text[2])));


все гораздо проще))
alex208210
постоялец
 
Сообщения: 207
Зарегистрирован: 12.05.2010 13:16:51

Re: [решено] Проверить, что строка начинается с русской букв

Сообщение Лекс Айрин » 18.07.2015 11:48:21

resident писал(а):А как вы получаете числовое значение?


это функция паскаля. Если это реализовано как в ТР, то проще всего так:

Код: Выделить всё
Var
    S:Char;
    A:byte absolute s;
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: [решено] Проверить, что строка начинается с русской букв

Сообщение resident » 18.07.2015 21:31:36

alex208210 писал(а):все гораздо проще))

Да, ваш попроще будет. Но вроде и мой вариант работает :)

Код: Выделить всё
{------------------------------------------------------------------------------}
function IsUtf8CharInLimits(const p, left, right: PChar): boolean;
  var
    CharLen: integer; // длина UTF в байтах, здесь не нужна, просто требуется в функции
    U: integer; // Юникод символа
  begin
    U := UTF8CharacterToUnicode(p, CharLen);
    if U = 0 then
      begin
        Result := false;
        exit;
      end;
    Result := (
      (U >= UTF8CharacterToUnicode(left, CharLen)) and
      (U <= UTF8CharacterToUnicode(right, CharLen)));
  end;

function IsUtf8CharRus(const p: PChar): boolean;
  begin
    // Кириллица упорядочена в таблице Unicode по алфавиту, при этом сначала
    //   идут заглавные буквы, а потом строчные, т.е. [А...Я, а..я]
    // Таким образом заглавная "А" и строчная "я" являются левой и правой
    //   границами диапазона
    Result := IsUtf8CharInLimits(p, 'А', 'я');
  end;
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 232

Рейтинг@Mail.ru