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

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

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

Ответить
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

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

Сообщение qivi »

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

Код: Выделить всё

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] показала крякозябрик, следовательно опять отсчитывает байты вместо символов. Как можно это дело обойти помимо перекодирования в анси и обратно в утф?
Аватара пользователя
WindOfPain
новенький
Сообщения: 33
Зарегистрирован: 01.09.2009 21:18:23
Откуда: Санкт-Петербург

Сообщение WindOfPain »

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

Код: Выделить всё

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;
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

Просвяти пожалуйста что такое pos(' ',S)?
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

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

Нахождение первого вхождения в строку указанной подстроки
обрати внимание, в прпимре ищется не один пробел, а 2 (два)!
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

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

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

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

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

Всё же чем можно заменить такое обращение к символу:

Код: Выделить всё

Textes[I]
в кодировке UTF8?
Аватара пользователя
WindOfPain
новенький
Сообщения: 33
Зарегистрирован: 01.09.2009 21:18:23
Откуда: Санкт-Петербург

Сообщение WindOfPain »

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
begin
     Edit2.Caption:=Copy(Edit1.Caption,1,1);
end;


посмотри подпрограммы для работы со строками.
Например, Copy вернет подстроку из указанной строки. Порядок параметров (строка источник; начальная позиция копирования; количество элементов строки для копирования). В нашем случае, в Edit2.Caption попадает первый элемент из Edit1.Caption
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

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

Сообщение WindOfPain »

alexs
Спасибо. Не знал про эти подпрограммы.
Ответить