Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.11.23;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.006 c
2-1223801070
KTA
2008-10-12 12:44
2008.11.23
Вывод на печать


2-1223623025
stas
2008-10-10 11:17
2008.11.23
dbf и кодировка


15-1222245849
stone
2008-09-24 12:44
2008.11.23
Быстрые клавиши в Code Editor в Delphi 7


15-1221800134
md10
2008-09-19 08:55
2008.11.23
Дейт - БД


15-1222404395
Городской Шаман
2008-09-26 08:46
2008.11.23
Очень интересные выводы :)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский