Удаление задвоенных пробелов (опять подстава с UTF8)

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Удаление задвоенных пробелов (опять подстава с UTF8)

Сообщение qivi » 20.02.2010 00:11:54

Нужно зачистить строку от сдвоенных (и более) пробелов, по дельфовым примерам попробовал так:

Код: Выделить всё
I:=1;
while I<=UTF8Length(Textes) do
begin
  if (Textes[I]=' ') and (Textes[I+1]=' ') then UTF8Delete(Textes,I,1) else I:=I+1;
end;


Работать эта конструкция отказалась, попытка вывода в showmessage Textes[I] показала крякозябрик, следовательно опять отсчитывает байты вместо символов. Как можно это дело обойти помимо перекодирования в анси и обратно в утф?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Удаление задвоенных пробелов (опять подстава с UTF8)

Сообщение WindOfPain » 20.02.2010 00:19:31

попробуй нечто подобное:

Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
  s:string;
begin
     s:=Edit1.Caption;
     while pos('  ',S)<>0 do
     begin
          delete(s,pos('  ',s),1);
     end;
     Edit1.Caption:=s;
end;
Аватара пользователя
WindOfPain
новенький
 
Сообщения: 33
Зарегистрирован: 01.09.2009 21:18:23
Откуда: Санкт-Петербург

Re: Удаление задвоенных пробелов (опять подстава с UTF8)

Сообщение qivi » 20.02.2010 00:26:55

Просвяти пожалуйста что такое pos(' ',S)?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Удаление задвоенных пробелов (опять подстава с UTF8)

Сообщение alexs » 20.02.2010 00:42:49

qivi
твоя проблема в том, что ты смешиваеш работу со строкой в старом и новом стиле - если обращаешся к строке поэлементно - то не используй функции UTF8, а если их используеш - то индекс символа и сам символ получай с помощью фукций.
В твоём случае - проще и быстрее сделать безх UTF8 - будет правильно работать.
qivi писал(а):Просвяти пожалуйста что такое pos(' ',S)?

Нахождение первого вхождения в строку указанной подстроки
обрати внимание, в прпимре ищется не один пробел, а 2 (два)!
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Удаление задвоенных пробелов (опять подстава с UTF8)

Сообщение qivi » 20.02.2010 01:07:30

Спасибо, опробовал работает. :)

alexs, да я заметил что их там 2.

Добавлено спустя 1 час 8 минут 5 секунд:

Пардон... продолжаю обрабатывать строки...

Всё же чем можно заменить такое обращение к символу:
Код: Выделить всё
Textes[I]
в кодировке UTF8?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Удаление задвоенных пробелов (опять подстава с UTF8)

Сообщение WindOfPain » 20.02.2010 08:52:26

Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
begin
     Edit2.Caption:=Copy(Edit1.Caption,1,1);
end;


посмотри подпрограммы для работы со строками.
Например, Copy вернет подстроку из указанной строки. Порядок параметров (строка источник; начальная позиция копирования; количество элементов строки для копирования). В нашем случае, в Edit2.Caption попадает первый элемент из Edit1.Caption
Аватара пользователя
WindOfPain
новенький
 
Сообщения: 33
Зарегистрирован: 01.09.2009 21:18:23
Откуда: Санкт-Петербург

Re: Удаление задвоенных пробелов (опять подстава с UTF8)

Сообщение alexs » 20.02.2010 10:26:37

WindOfPain
Почти правильно - только надо использовать UTF8Copy. И не забывать что указываем номер символа в кодировке UTF8, а не номер байта. Номер символа можно найти через UTF8Pos.
qivi
А в твоём случаем - посмотри функцию TextToSingleLine из модуля LCLProc.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Удаление задвоенных пробелов (опять подстава с UTF8)

Сообщение WindOfPain » 20.02.2010 10:54:56

alexs
Спасибо. Не знал про эти подпрограммы.
Аватара пользователя
WindOfPain
новенький
 
Сообщения: 33
Зарегистрирован: 01.09.2009 21:18:23
Откуда: Санкт-Петербург


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 45

Рейтинг@Mail.ru