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

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

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

Ответить
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

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

Сообщение resident »

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

Как узнать, что строка начинается с определенного диапазона русских букв?
Например, с букв от "А" до "Л" независимо от регистра.
Вот такой код не работает, пишет "Ordinal expression expected"

Код: Выделить всё

RussianLanguage := (str[1] in ['А'..'Л']) or (str[1] in ['а'..'л']);

Я конечно могу сделать функцию и в ней пробегать по массиву алфавита. Но надеюсь, решение есть из коробки. (С английскими же работает.)
Последний раз редактировалось resident 17.07.2015 18:06:26, всего редактировалось 1 раз.
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

А вот так?

Код: Выделить всё

if UTF8Pos(UTF8Copy(S, 1, 1), 'АБВГабвг')>0 then
  ...
else
  ...
alex208210
постоялец
Сообщения: 207
Зарегистрирован: 12.05.2010 13:16:51

Сообщение alex208210 »

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

Сообщение resident »

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

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).
alex208210
постоялец
Сообщения: 207
Зарегистрирован: 12.05.2010 13:16:51

Сообщение alex208210 »

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

Отсюда
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

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

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

Сообщение alex208210 »

ну например так:

Код: Выделить всё

showmessage(inttostr(ord(edit1.Text[1]))+inttostr(ord(edit1.Text[2])));


все гораздо проще))
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

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


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

Код: Выделить всё

Var
    S:Char;
    A:byte absolute s;
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

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;
 
Ответить