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

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

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

arriah
новенький
Сообщения: 94
Зарегистрирован: 29.07.2015 15:42:35

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

Сообщение arriah »

Какие есть невидимые, непечатные символы?
Ситуация такая, в 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++ включал там отображение всех символов - данный символ показывается типа пробел, и не имеет никакого визуального оформления - копировал его в буфер, вставлял в в прогу - удаляет. Пробовал получить его код - не отдает...
Что это может быть за символ?
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

А пробовал #0? Символы табуляции?
arriah
новенький
Сообщения: 94
Зарегистрирован: 29.07.2015 15:42:35

Сообщение arriah »

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

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

Сообщение Лекс Айрин »

табуляция бывает как горизонтальная, так и вертикальная 0B(11). Возможно, что это какой-то управляющий юникодный символ.
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

а что length говорит?
т.е.

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

for i:=StringList.Count-1 downto 0 do begin
   If utf8length(utf8trim(StringList[i])) = 0 then StringList.Delete(i);
end;

Вроде в stringlist utf8 должен быть.
arriah
новенький
Сообщения: 94
Зарегистрирован: 29.07.2015 15:42:35

Сообщение arriah »

Лекс Айрин писал(а):табуляция бывает как горизонтальная, так и вертикальная 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
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

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 — разделитель абзацев.
arriah
новенький
Сообщения: 94
Зарегистрирован: 29.07.2015 15:42:35

Сообщение arriah »

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

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

LF - #10
CR - #13

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

Сообщение Лекс Айрин »

arriah, скорее, все же не так. Мой запрос "юникодный конец строки" Кстати,только теперь заметил в нем опечатку. Искал юниксовый
arriah
новенький
Сообщения: 94
Зарегистрирован: 29.07.2015 15:42:35

Сообщение arriah »

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

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

Сообщение Лекс Айрин »

arriah вообще, такие вещи надо хранить отдельно -- для тестов.
arriah
новенький
Сообщения: 94
Зарегистрирован: 29.07.2015 15:42:35

Сообщение arriah »

Лекс Айрин писал(а):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
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

А что это покажет?

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

for k := 1 to Length(str) do
  ss := ss + '$'+IntToHex(Ord(str[k]),2)) ;
arriah
новенький
Сообщения: 94
Зарегистрирован: 29.07.2015 15:42:35

Сообщение arriah »

pupsik писал(а):А что это покажет?

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

for k := 1 to Length(str) do
  ss := ss + '$'+IntToHex(Ord(str[k]),2)) ;

тоже самое только в Hex:
$20 $20 $C2 $A0 $20
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

2 пробела, 1 NO-BREAK SPACE и пробел???
Где NO-BREAK SPACE -неразрывный пробел. Т.е. просто пробелы?
Последний раз редактировалось pupsik 22.07.2016 15:27:15, всего редактировалось 1 раз.
Ответить