![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Символ кирилицы в строке. Как определить? [D7]
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]
Ты про условие "в любых кодировках" не забыл?