Невидимые символы

Форум для изучающих FPC и их учителей.

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

Невидимые символы

Сообщение arriah » 19.07.2016 13:35:52

Какие есть невидимые, непечатные символы?
Ситуация такая, в TSTringList есть строки, некоторые из них пустые, вот надо удалить пустые строки написал такое:

Код: Выделить всё
for i:=StringList.Count-1 downto 0 do begin
   If trim(StringList[i])='' then StringList.Delete(i);
end;

Удалzются все пустые строки, но некоторые нехотят. Ствил дополительные проверки на #9, #13#10, #10, #255 - все равно не удаляются.
длина неудаляемой строки показывает 2
Копировал в notepad++ включал там отображение всех символов - данный символ показывается типа пробел, и не имеет никакого визуального оформления - копировал его в буфер, вставлял в в прогу - удаляет. Пробовал получить его код - не отдает...
Что это может быть за символ?
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: Невидимые символы

Сообщение Лекс Айрин » 19.07.2016 14:15:58

А пробовал #0? Символы табуляции?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Невидимые символы

Сообщение arriah » 19.07.2016 14:41:34

Лекс Айрин писал(а):А пробовал #0? Символы табуляции?

#0 попробую как домой вернусь, а табуляцию (#9) пробовал
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: Невидимые символы

Сообщение Лекс Айрин » 19.07.2016 14:51:05

табуляция бывает как горизонтальная, так и вертикальная 0B(11). Возможно, что это какой-то управляющий юникодный символ.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Невидимые символы

Сообщение pupsik » 19.07.2016 15:22:54

а что length говорит?
т.е.
Код: Выделить всё
for i:=StringList.Count-1 downto 0 do begin
   If utf8length(utf8trim(StringList[i])) = 0 then StringList.Delete(i);
end;

Вроде в stringlist utf8 должен быть.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Невидимые символы

Сообщение arriah » 19.07.2016 15:30:03

Лекс Айрин писал(а):табуляция бывает как горизонтальная, так и вертикальная 0B(11). Возможно, что это какой-то управляющий юникодный символ.

Хм, вот этого не знал. Проверю

Добавлено спустя 1 минуту 15 секунд:
pupsik писал(а):а что length говорит?
т.е.
Код: Выделить всё
for i:=StringList.Count-1 downto 0 do begin
   If utf8length(utf8trim(StringList[i])) = 0 then StringList.Delete(i);
end;

Вроде в stringlist utf8 должен быть.

Вечером проверю, обычный length (без utf8) говорит - 2
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: Невидимые символы

Сообщение Лекс Айрин » 19.07.2016 16:57:19

arriah, я начинал с доса -- там управляющие символы использовались намного чаще. И более широкий ассортимент.

я бы, кстати,если нет других особенностей типа использования символов нот, перевернул задачу. Легче проверить есть ли в строке определенные символы (латинские/русские буквы, знаки препинания и цифры) и если нет, то удалить.

При этом, не стоит забывать, что в некоторых шрифтах неиспользуемые символы типа 3/8 отображаются как пробелы.

arriah писал(а):Вечером проверю, обычный length (без utf8) говорит - 2

проверьте так же

Код: Выделить всё
- LF (U+000A): англ. line feed — подача строки;
- CR (U+000D): англ. carriage return — возврат каретки;
- NEL (U+0085): англ. next line — переход на следующую строку;
- LS (U+2028): англ. line separator — разделитель строк;
- PS (U+2029): англ. paragraph separator — разделитель абзацев.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Невидимые символы

Сообщение arriah » 19.07.2016 17:58:30

Лекс Айрин писал(а):проверьте так же

Спасибо. А то я или не так гуглил или меня в гугле забанили :)

LF - #10
CR - #13

Эти я проверял
Остальные проверю вечером
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: Невидимые символы

Сообщение Лекс Айрин » 19.07.2016 18:07:07

arriah, скорее, все же не так. Мой запрос "юникодный конец строки" Кстати,только теперь заметил в нем опечатку. Искал юниксовый
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Невидимые символы

Сообщение arriah » 19.07.2016 23:45:26

Лекс Айрин писал(а):arriah, скорее, все же не так. Мой запрос "юникодный конец строки" Кстати,только теперь заметил в нем опечатку. Искал юниксовый

По иронии судьбы - этот файлик уже куда-то делся :) Видать без меня его обработали (в принципе пустая строка ни на что не влияет, но хочется красоты и порядка) - появится еще подобны файлик - буду проверять :)
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: Невидимые символы

Сообщение Лекс Айрин » 20.07.2016 09:22:28

arriah вообще, такие вещи надо хранить отдельно -- для тестов.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Невидимые символы

Сообщение arriah » 22.07.2016 14:16:06

Лекс Айрин писал(а):arriah вообще, такие вещи надо хранить отдельно -- для тестов.

конечно надо :) Но так как данные поступают из разных мест, то вероятность получения такой "вещи" почти 100% - вот я ее и получил.
Попробовал utf8trim - проблема исчезла, но как говорит Задорнов "эксперимент-то не завершен!".. хочется определить этот долбанный символ...
Со структурой UTF8 знаком мало, только в переделах функций из lazUTF8.

Но то что эта зараз юникодная - сомнений не осталось.
Подскажите примером кода - как получить код этого символа в unicode?

Добавлено спустя 56 минут 42 секунды:
вот такой код
Код: Выделить всё
var
s:char;
ss:string;
begin
   if utf8trim(str)='' then
   begin
     ss:='';
     for k:=1 to length(str) do begin
      s:=str[k];
      ss:=ss+IntToStr(ord(s))+'  ';
     end;
     showmessage(ss);
end;
end;   

выдает результат: 32 32 194 160 32
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: Невидимые символы

Сообщение pupsik » 22.07.2016 15:46:04

А что это покажет?
Код: Выделить всё
for k := 1 to Length(str) do
  ss := ss + '$'+IntToHex(Ord(str[k]),2)) ;
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Невидимые символы

Сообщение arriah » 22.07.2016 16:15:43

pupsik писал(а):А что это покажет?
Код: Выделить всё
for k := 1 to Length(str) do
  ss := ss + '$'+IntToHex(Ord(str[k]),2)) ;

тоже самое только в Hex:
$20 $20 $C2 $A0 $20
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: Невидимые символы

Сообщение pupsik » 22.07.2016 16:22:52

2 пробела, 1 NO-BREAK SPACE и пробел???
Где NO-BREAK SPACE -неразрывный пробел. Т.е. просто пробелы?
Последний раз редактировалось pupsik 22.07.2016 16:27:15, всего редактировалось 1 раз.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

След.

Вернуться в Обучение Free Pascal

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15

Рейтинг@Mail.ru