Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Символ кирилицы в строке. Как определить? [D7]


Страницы:   1 2 3

cruiser ©   (2008-10-13 14:48:00) 

Уважаемые мастера! Как определить, есть ли в строковой переменной типа string символы кирилицы? Т.е. например, определить нахождение буквы "и" в строке "prиmer". Спасибо!


Johnmen   (2008-10-14 15:28:00) [1]


> Прописанный путь к файлу нужно проверить на наличие только
> латинских букв и отсутствие всего остального.

Это такая "постановка задачи"? :)))


Anatoly Podgoretsky   (2008-10-14 15:05:00) [2]

> cruiser  (14.10.2008 14:52:42)  [42]

Тогда ты не сможешь ввести даже расширение.


cruiser   (2008-10-14 14:52:00) [3]


> Ну так и следуй постановке задачи, какие символы недопустимы.
>  Зачем у нас спрашиваешь?

Просил помощи в реализации кода. Спасибо всем за участие. Буду пробовать.

> Огласите всю задачу.

в 34 написал подробно
Прописанный путь к файлу нужно проверить на наличие только латинских букв и отсутствие всего остального.


Johnmen   (2008-10-14 14:44:00) [4]


> Почему же запятые не должны быть?
>
> cruiser ©   (14.10.08 14:26) [36]
> 2 Johnmen: По условию поставленной задачи :)

Ну так и следуй постановке задачи, какие символы недопустимы. Зачем у нас спрашиваешь?


Anatoly Podgoretsky   (2008-10-14 14:42:00) [5]

> clickmaker  (14.10.2008 14:32:37)  [37]

Неправильно, надо по множеству разрешеных символов.


Anatoly Podgoretsky   (2008-10-14 14:40:00) [6]

> cruiser  (14.10.2008 14:26:36)  [36]

Огласите всю задачу.


cruiser   (2008-10-14 14:34:00) [7]

да. так и сделаю, когда доберусь до делфи. спасибо всем за помощь. буду пробовать!


clickmaker   (2008-10-14 14:32:00) [8]

> отличные от латиницы символы

тогда проще проверить на A-Z, a-z + цифры, если надо


cruiser   (2008-10-14 14:26:00) [9]

2 Johnmen: По условию поставленной задачи :)


Johnmen   (2008-10-14 14:20:00) [10]


> для определения если в пути к файлу отличные от латиницы символы

А зачем?

> а также  запятые ... которые не должны быть в пути к файлу

Почему же запятые не должны быть?


cruiser   (2008-10-14 14:08:00) [11]

Извините, за то что выдал не полную инфу. В общем сабж нужен для определения если в пути к файлу отличные от латиницы символы , а также  запятые и другие знаки которые не должны быть в пути к файлу.


Johnmen   (2008-10-14 09:22:00) [12]


> MsGuns ©   (13.10.08 20:29) [27]

Ё-мо ё, ты забыл про самую главную букву русского алфавита - про ё( Ё)!!!
А т.к. [3], то код неприменим...


Anatoly Podgoretsky   (2008-10-14 01:13:00) [13]

> Германн  (14.10.2008 1:12:31)  [31]

Да кто же серьзно будет отвечать при такой постановке вопроса.


Германн   (2008-10-14 01:12:00) [14]

И тут опять же вопрос есть (заданный на пальцах), а объяснения задачи нет. Отвечать можно почти всё что угодно, но смысла никакого.


Anatoly Podgoretsky   (2008-10-13 21:50:00) [15]


> MsGuns ©   (13.10.08 21:30) [29]

А ты [3] читал?


MsGuns   (2008-10-13 21:30:00) [16]

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


Anatoly Podgoretsky   (2008-10-13 21:08:00) [17]

> MsGuns  (13.10.2008 20:29:27)  [27]

> // Функция ищет первую букву в строке и по ней определяет базовый язык

Ну нашел, ее код равен $C0 дальше что?
Сделав оговорку/условие, что "в любой кодировке" автор сделал задачу не выполнимой. Даже поиск по словарю не даст эффекта, если размер будет недостаточным для анализа или если будут разные языки в одном тексте.


MsGuns   (2008-10-13 20:29:00) [18]

type
 TComFnc_StringLocale = (slmNone,slmRus,slmLat,slmRusLat,slmLatRus);

function MS_ComFnGetCharLocale(Lit: Char): TComFnc_StringLocale;
// Функция определения символа к языку
begin
 result := slmNone;
 if Lit in ['A'..'Z','a'..'z'] then result := slmLat
 else
    if Lit in ['А'..'Я','а'..'я'] then result := slmRus;
end;

function MS_ComFnParseLocaleMix(var StrOut: string; Str: string;
  MixPosList: TStrings): TComFnc_StringLocale;
// Функция ищет первую букву в строке и по ней определяет базовый язык
// Далее перебираются все символы в строке и, если буква, то
// проверяется, относится ли она к алфавиту базового языка.
// Если нет, то в result добавляется опция другого языка, а позиция
// символа в строке, преобразованная в стринг, заносится в список "ошибок"
//  - StrOut - строка, содержащая исходную строку с "перевернутыми" ошибочными символами
//  - Str - исходная строка
//  - MixPosList - список позиций (в текстовом формате) строки, содержащих ошибки
//  Пример:
//     Str = 'Иванов Вася' (буквы 'a', 'В' и 'o' набраны на латинице)
//     StrOut = 'ИвAнOв bася'
//     MixPosList = '3','5','8'
//     result = smRusLat
var
 p: integer;
 BaseLocale,MixLocale: TComFnc_StringLocale;
 S: string;
begin
 result := slmNone; StrOut := ''; p := 1;
 BaseLocale := slmNone;
 MixPosList.Clear;
 while p<=Length(Str) do
   begin
    S := Str[p];
    if BaseLocale=slmNone then  // Нет первой буквы
      begin
       BaseLocale := MS_ComFnGetCharLocale(Str[p]);
       result := BaseLocale;
      end
    else
      begin // Язык строки определен
       MixLocale := MS_ComFnGetCharLocale(Str[p]);
       if (MixLocale<>slmNone) and (MixLocale<>BaseLocale) then
         begin  // Символ содержит букву не из языка строки
          if result=slmRus then result := slmRusLat;
          if result=slmLat then result := slmLatRus;
          MixPosList.Add(IntToStr(p));
          // 'Перевернуть' символ
          if S=AnsiUpperCase(S) then S := AnsiLowerCase(S)
          else S := AnsiUpperCase(S);
         end;
      end;
    StrOut := StrOut+S;
    inc(p);
   end;
 if not (result in [slmRusLat,slmLatRus]) then StrOut := '';
end;

function MS_ComFnStringConvertLang(S: string; ConverType: Char; Errs: TStrings): string;
// Функция переводит символы русского алфавита в латинский и наоборот
// Ковертрованию подлежат символы, имеющие одинаковое начертание в
//  обоих языках (A,B,C,E,H,K,M,O,P,T,X)
// ConverType - 'R' латинские буквы в русские
//              'L' русские буквы в латинские
// Errs - список индексов символов строки, подвергшихся конвертированию
const
 // Перваый символ каждой пары - латинский, второй - русский
 RusLatSymbolsCap: array[0..10,0..1] of Char =
    (('A','А'),('B','В'),('C','С'),('E','Е'),('H','Н'),
     ('K','К'),('M','М'),('O','О'),('P','Р'),('T','Т'),('X','Х'));
 RusLatSymbols: array[0..5,0..1] of Char =
    (('a','а'),('c','с'),('e','e'),('o','о'),('p','р'),('x','х'));
var
 i,j: integer;
 Smb: Char;

begin
 result := '';
 Errs.Clear;
 for i := 1 to Length(S) do
   begin
    Smb := ' ';
    if ConverType='R' then
      begin
       for j := LOW(RusLatSymbolsCap) to HIGH(RusLatSymbolsCap) do
         if S[i]=RusLatSymbolsCap[j,0] then
           begin Smb := RusLatSymbolsCap[j,1]; break; end;
       if Smb=' ' then
          for j := LOW(RusLatSymbols) to HIGH(RusLatSymbols) do
            if S[i]=RusLatSymbols[j,0] then
              begin Smb := RusLatSymbols[j,1]; break; end;
      end
    else
      begin
       for j := LOW(RusLatSymbolsCap) to HIGH(RusLatSymbolsCap) do
         if S[i]=RusLatSymbolsCap[j,1] then
           begin Smb := RusLatSymbolsCap[j,0]; break; end;
       if Smb=' ' then
          for j := LOW(RusLatSymbols) to HIGH(RusLatSymbols) do
            if S[i]=RusLatSymbols[j,1] then
              begin Smb := RusLatSymbols[j,0]; break; end;
      end;
    if Smb=' ' then result := result+S[i]
    else
      begin
       result := result+Smb;
       Errs.Add(IntToStr(i));
      end;
   end;
end;


Anatoly Podgoretsky   (2008-10-13 19:24:00) [19]

> DevilDevil  (13.10.2008 18:53:24)  [24]

Можно, как минимум для текущего языка потока


Anatoly Podgoretsky   (2008-10-13 19:20:00) [20]

> DevilDevil  (13.10.2008 18:53:24)  [24]

Ты про условие "в любых кодировках" не забыл?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо