Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.11.23;
Скачать: CL | DM;

Вниз

Символ кирилицы в строке. Как определить?   Найти похожие ветки 

 
cruiser ©   (2008-10-13 14:48) [0]

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


 
Сергей М. ©   (2008-10-13 14:54) [1]

Без знания конкретной кодировки символов в строке - никак.


 
Поросенок Винни-Пух ©   (2008-10-13 14:54) [2]

пройтись по строке как массиву и сравниить элементы на вхождение в диапазон


 
cruiser ©   (2008-10-13 14:56) [3]

Эти способы я видел. Нужно конкретнее. Кодировка может быть разной.
Либо, могу переформулировать вопрос так: опредилить, все ли символы в строке латиница? Может можно с этой стороны посмотреть?


 
Vlad Oshin ©   (2008-10-13 15:02) [4]

s:="qwцqw";

for i:=1 to length(s) do if (ord(s[i])>=ord("а")) and (ord(s[i])<=ord("я")) then ShowMessage(s[i]);

s2:="йцукенгшщзхъфывапролджэячсмитьбю";
for I := 1 to length(s) do
 for j := 1 to length(s2) do if s[i]=s2[j] then ShowMessage(s[i]);


 
Сергей М. ©   (2008-10-13 15:04) [5]


> Может можно с этой стороны посмотреть


Те же фаберже, только вид сбоку)


 
cruiser ©   (2008-10-13 15:06) [6]

Спасибо! Нашел такую постановку решения:
if s[i] in ["a".."Я", "A".."Я"]) ] then showmessage ("кирилица "+s[i])
не пойдет такой код вместо if (ord(s[i])>=ord("а")) and (ord(s[i])<=ord("я"))  ?


 
Vlad Oshin ©   (2008-10-13 15:14) [7]

а запустить да посмотреть?


 
cruiser ©   (2008-10-13 15:18) [8]

запущу, но сейчас нет под руками делфи :) спасибо за советы!


 
Правильный$Вася   (2008-10-13 15:24) [9]

по-любому [1] читать и думать


 
{RASkov} ©   (2008-10-13 16:01) [10]

Может достаточно:
Все что выше 127 - не латиница...?


 
Правильный$Вася   (2008-10-13 16:17) [11]


> Все что выше 127 - не латиница...?

символ "5" - это латиница?


 
Anatoly Podgoretsky ©   (2008-10-13 16:19) [12]


> cruiser ©   (13.10.08 15:06) [6]

Противоречит этому

> Кодировка может быть разной. [3]


 
Anatoly Podgoretsky ©   (2008-10-13 16:21) [13]

128-52(латиница) = 76, что делать с этим прикажешь.
Начинать надо с определения, что такое кирилица, с учетом [3] и что такое НЕ. Ну и если после этого появятся вопросы, то пригласить программиста.


 
Palladin ©   (2008-10-13 16:29) [14]


> cruiser ©   (13.10.08 14:48) 

для чего это нужно?


 
{RASkov} ©   (2008-10-13 16:37) [15]

> символ "5" - это латиница?

Символ 5 - это ниже 127(53) значит относится к латинице.... А вообще это цифра.... и как уж ее нужно идентифицировать автору - это его дело...
:)


 
{RASkov} ©   (2008-10-13 17:05) [16]

> [3] cruiser ©   (13.10.08 14:56)
> Кодировка может быть разной.

D7 и String....
Все равно символы национального алфавита распологаются во второй половине значений байта.... т.е. со 128...


> например, определить нахождение буквы "и" в строке "prиmer".

Уже сказанного и этого:
function IsAllLatinChar(S: String): Boolean;
var N: Integer;
begin
 Result:=True;
 for N:=1 to Length(S) do begin
  Result:=ORD(S[N])<128;
  if not Result then Exit;
 end;
end;

type TBadChar = Set of Char;
function IsExistsBadChar(S: String; BadCh: TBadChar): Boolean;
var N: Integer;
begin
 Result:=False;
 for N:=1 to Length(S) do
  if S[N] in BadCh then begin
   Result:=True;
   Exit;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 if IsAllLatinChar(Edit1.Text) then ShowMessage("Строка не содержит символов национальной кодировки") else
  ShowMessage("В строке присутствуют символы национально кодировки");
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 if IsExistsBadChar(Edit1.Text, ["А".."я", "Ё", "ё", #0..#31]) then ShowMessage("Строка содержит не допустимые символы") else
  ShowMessage("Всё нормально:)");
end;

...будет достаточно.


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

> Правильный$Вася  (13.10.2008 16:17:11)  [11]

Нет


 
Anatoly Podgoretsky ©   (2008-10-13 17:10) [18]


> Символ 5 - это ниже 127(53) значит относится к латинице.
> ...

И CRLF тоже.


 
{RASkov} ©   (2008-10-13 17:13) [19]

> [18] Anatoly Podgoretsky ©   (13.10.08 17:10)

И да и нет.) Он общий... а автору это не важно.... ему важно, чтоб "и" небыло в prиmere)
Скажем так.... Латинских символов с кодом выше 127 нет, и наоборот.... нет национальных с кодом ниже 128....
:)


 
{RASkov} ©   (2008-10-13 17:20) [20]

Для более привиредливых вторая функция и например наборы "плохих" символов:
const Lat = ["A".."z"];
     LatAndDig = ["A".."z", "0".."1"];


ну и вызов
if IsExistsBadChar(Edit1.Text, Lat) then....
^)


 
{RASkov} ©   (2008-10-13 17:21) [21]

> "0".."1"

т.е. "0".."9" :) неважно...)


 
Anatoly Podgoretsky ©   (2008-10-13 18:04) [22]

> {RASkov}  (13.10.2008 17:20:20)  [20]

Ну да и точка, и запятая тоже плохие символы.


 
{RASkov} ©   (2008-10-13 18:17) [23]

> [22] Anatoly Podgoretsky ©   (13.10.08 18:04)

Да кто его знает.... может и плохие для автора...
По мне - они все хорошие :)


 
DevilDevil ©   (2008-10-13 18:53) [24]

const
 RussianChars: set of char = ["а".."я", "А".."Я", "ё", "Ё"];

function RusChar(const S: string): integer;
begin
 for Result := 1 to Length(S) do
 if (S[Result] in RussianChars) then exit;

 Result := 0;
end;


вроде так.

Присоединяючь (продолжаю) к вопросу.
Если я имею идентификатор языка, можно ли посредством WinAPI определить список кодов алфавита этого языка: строчные и прописные. Имеется ли возможность отделать большие буквы от маленьких, имея идентификатор языка? Как получить список языков и их идентификаторов ?


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

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

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


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

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

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


 
MsGuns ©   (2008-10-13 20:29) [27]

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 21:08) [28]

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

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

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


 
MsGuns ©   (2008-10-13 21:30) [29]

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


 
Anatoly Podgoretsky ©   (2008-10-13 21:50) [30]


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

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


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

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


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

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

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


 
Johnmen ©   (2008-10-14 09:22) [33]


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

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


 
cruiser ©   (2008-10-14 14:08) [34]

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


 
Johnmen ©   (2008-10-14 14:20) [35]


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

А зачем?

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

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


 
cruiser ©   (2008-10-14 14:26) [36]

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


 
clickmaker ©   (2008-10-14 14:32) [37]

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

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


 
cruiser ©   (2008-10-14 14:34) [38]

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


 
Anatoly Podgoretsky ©   (2008-10-14 14:40) [39]

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

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


 
Anatoly Podgoretsky ©   (2008-10-14 14:42) [40]

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

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



Страницы: 1 2 вся ветка

Текущий архив: 2008.11.23;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.013 c
15-1222245849
stone
2008-09-24 12:44
2008.11.23
Быстрые клавиши в Code Editor в Delphi 7


3-1209540771
IgorBet
2008-04-30 11:32
2008.11.23
Вопросы надежности при частом создании/ удалении таблиц


6-1195512896
Dark Lord
2007-11-20 01:54
2008.11.23
Множество динамических WebBrowser ов в программе


15-1222252560
DelphiN!
2008-09-24 14:36
2008.11.23
Объединение 2х сетей в одну


4-1200314257
mt2
2008-01-14 15:37
2008.11.23
Странный deadlock