Форум: "Начинающим";
Текущий архив: 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